import java.util.Comparator;
import java.util.TreeMap;
public class Manager {
public static void main(String[] args) {
TreeMap tmap1 = new TreeMap(new C.D());
tmap1.put(new C(9, 1), 9);
tmap1.put(new C(0, 10), 19);
tmap1.put(new C(1, 8), 92);
tmap1.put(new C(8, 0), 91);
tmap1.put(new C(5, 4), 39);
tmap1.put(new C(5,4), 73);//this line
System.out.println(tmap1);
}
}
class C {
int i, j;
C(int i, int j) {
this.i = i;
this.j = j;
}
public String toString() {
return "(i=" + i + ",j=" + j + ")";
}
static class D implements Comparator {
public int compare(Object obj1, Object obj2) {
return ((C)obj1).i - ((C)obj2).i;
}
}
}
//我们知道TreeMap根据键进行排序,在这里我传递一个比较器并根据变量i进行排序。当我尝试在treemap1中输入新条目时,我在评论中提到它为{{1} },它在删除前一个相同的条目时添加这个新条目。好类C不会覆盖hashcode()和equals()方法,因此新条目与之前的条目完全不同,因为它们具有基于Object类的不同hashcode(),因此两个条目都应保留在map中,但只添加新条目和之前的一个删除。
答案 0 :(得分:1)
如果是行
tmap1.put(new C(5,4), 73);
你的比较器返回0,因此它对于JVM是重复的并且它会覆盖它。
如下所示放置一个调试语句并重新运行程序,您将了解事实..
public int compare(Object obj1, Object obj2) {
System.out.println("in compare difference is : "+ (((C)obj1).i - ((C)obj2).i));
return ((C)obj1).i - ((C)obj2).i;
}
你将得到低于输出......最后看到零(0)
in compare : -9
in compare : -8
in compare : 1
in compare : 7
in compare : -1
in compare : 4
in compare : -4
in compare : -3
in compare : 4
in compare : -3
in compare : 0
答案 1 :(得分:1)
在您的情况下,问题是因为如果您使用TreeMap
并提供Comparator
,则还应提供正确的equals
方法。它位于TreeMap的JavaDoc中:
请注意,如果此有序映射要正确实现Map接口,则树映射维护的顺序(如任何已排序的映射,以及是否提供显式比较器)必须与equals一致
您的equals方法是从Object继承的,并且与您的Comparator不一致。
使用TreeMap
put
方法获取战利品,并将其与HashMap
put
方法进行比较。 TreeMap的版本仅使用compareTo
方法,而不是像HashMap中的equals
那样。
从Java 1.5开始,你不应该使用原始类型