下面是Comparator的代码,但是在SortedMap.putAll()之后,与源Map相比,SortedMap的Map Entries数量更少。
有人可以帮忙吗?
Comparator<ArrayList> arrayListComparer = new Comparator<ArrayList>() {
@Override
public int compare(ArrayList arrA, ArrayList arrB) {
DateFormat formatter = new SimpleDateFormat("MMM-yyyy");
Date dateA = new Date();
Date dateB = new Date();
try {
dateA = formatter.parse(arrA.get(0).toString());
dateB = formatter.parse(arrB.get(0).toString());
} catch (ParseException ex) {
Logger.getLogger(ValueComparator.class.getName()).log(Level.SEVERE, null, ex);
}
if (dateA.before(dateB)) {
return 0;
} else if (dateA.after(dateB)) {
return 1;
} else {
return -1;
}
}
};
SortedMap sorted_map = new TreeMap(arrayListComparer);
sorted_map.putAll(map);
答案 0 :(得分:0)
如果您能向我们展示您的地图示例,那会有所帮助,但无论如何我都会冒险回答。
可能导致这种情况的原因是您的地图中有compare
方法(在比较器中)的条目返回0,这意味着密钥相等。如果它们是相同的,那么它是相同的密钥......并且你不能在Map中有重复的密钥。
你能看到问题吗?
我会举一个例子:
public static void main(String[] args) {
Map<Bla, String> map = new HashMap<Bla, String>();
map.put(new Bla(1,1), "bla1");
map.put(new Bla(1,2), "bla2");
map.put(new Bla(1,3), "bla3");
System.out.println(map.size());
TreeMap<Bla, String> treeMap = new TreeMap<Bla,String>(new Comparator<Bla>() {
@Override
public int compare(Bla bla, Bla bla1) {
return new Integer(bla.a).compareTo(bla1.a);
}
});
treeMap.putAll(map);
System.out.println(treeMap.size());
}
private static class Bla{
private Bla(int a, int b) {
this.a = a;
this.b = b;
}
public int a;
public int b;
}
这将输出
3 1
因为我的比较器说所有三个键都相同(只比较“a”值)。
答案 1 :(得分:0)
当您使用SortedMap
或SortedSet
时,只有当两个对象相等时,您的Comparator
才会返回0。因为它按此标准处理密钥相等。
查看自然排序:http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html
例如,如果添加两个键a和b使得(!a.equals(b)&amp;&amp; a.compareTo(b)== 0)到不使用显式的有序集 比较器,第二个add操作返回false(和大小 排序集不会增加)因为a和b是等价的 排序集的视角。