簡體   English   中英

Java中的TreeMap

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM