您的位置:首页 > 编程语言 > Java开发

java编程思想-定制Map过程中出现的bug调试

2015-11-18 22:09 477 查看
package com.jackie;

import java.util.*;

/**
* Created by zhimeng on 15/11/18.
*/
public class Countries {
public static String[][] DATA = new String[][]{
{"China", "Beijing"}, {"Japan", "Tokyo"},
{"Taiwan", "Taibei"}, {"Zhejian", "Hangzhou"},
{"Hubei", "Wuhan"}, {"Jiangsu", "Nanjing"}
};

public static void main(String[] args) {
System.out.println(Countries.DATA);
}
}

class FlyweightMap extends AbstractMap<String, String> {
public static void main(String[] args) {
System.out.println(Countries.DATA);
}

@Override
public Set<Map.Entry<String, String>> entrySet() {
return entries;
}

private static class Entry implements Map.Entry<String, String> {
int index = -1;

public Entry(int index) {
this.index = index;
}

public String getKey() {
return Countries.DATA[index][0];
}

public String getValue() {
return Countries.DATA[index][1];
}

public String setValue(String value) {
throw new UnsupportedOperationException();
}

@Override
public boolean equals(Object obj) {
return Countries.DATA[index][0].equals(obj);
}

@Override
public int hashCode() {
return Countries.DATA[index][0].hashCode();
}
}

private static class EntrySet extends AbstractSet<Map.Entry<String, String>> {
private int size;
private Entry entry = new Entry(-1);

public EntrySet(int size) {
if (size < 0) {
this.size = 0;
} else if (size > Countries.DATA.length) {
this.size = Countries.DATA.length;
} else {
this.size = size;
}
}

@Override
public Iterator<Map.Entry<String, String>> iterator() {
return new Iter();
}

@Override
public int size() {
return size;
}

private class Iter implements Iterator<Map.Entry<String, String>> {

public boolean hasNext() {
System.out.println("size: " + size); //这里除了错误。因为这个判断条件应该是size-1;

return entry.index < size-1;
}

public Map.Entry<String, String> next() {
entry.index++;
System.out.println("entry index: " + entry.index);
return entry;
}
}
}

private static Set<Map.Entry<String, String>> entries = new EntrySet(Countries.DATA.length);

public static Map<String, String> select(final int size) {
return new FlyweightMap() {
@Override
public Set<Map.Entry<String, String>> entrySet() {
return new EntrySet(size);
}
};
}

public static Map<String, String> map = new FlyweightMap();

public static Map<String, String> capitals() {
return map;
}

public static Map<String, String> capitals(int size) {
return select(size);
}

static List<String> names = new ArrayList<String>(map.keySet());

public static List<String> names() {
return names;
}

public static List<String> names(int size) {
return new ArrayList<String>(select(size).keySet());
}


}



ps: 因为map 在生成keySet() 的时候,会调用entrySet()。 仅供自己bug的记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: