[英]TreeMap in Java
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中輸入新條目時,正如我在注釋中提到的那樣//this line
,它的添加此新條目,同時刪除以前的相同條目。 好吧,C類不會覆蓋hashcode()和equals()方法,因此新條目與以前的條目完全不同,因為它們基於Object類具有不同的hashcode(),因此兩個條目都應保留在map中,但僅添加一個新條目和上一個被刪除。
在線路的情況下
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
就您而言,問題是因為如果您使用TreeMap
並提供Comparator
那么您還應該提供正確的equals
方法。 在TreeMap的JavaDoc中:
請注意,如果樹排序圖要正確實現Map接口,則樹映射所維護的排序(與任何排序的映射一樣)以及是否提供顯式比較器必須與equals一致。
equals方法是從Object繼承的,它與Comparator不一致。
在TreeMap
put
方法上有一個戰利品,並將其與HashMap
put
方法進行比較。 TreeMap的版本僅使用compareTo
方法,而不是HashMap的put中的equals
。
順便說一句,從Java 1.5開始,您不應該使用原始類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.