2011-05-26 44 views
0

你好,我無法找到任何信息,我需要做什麼使兩個鍵看起來相等。也就是說,我需要提供一個將由map.put()使用的自定義比較方法。實現類似的不幫助。地圖中的複合鍵

例如,這段代碼並不像預期的那樣工作 - 爲了我的程序的目的,兩個鍵n和n2是相同的。

private class N implements Comparable<N> { 
     int value; 

     int stuff; 

     String z; 

     @Override 
     public int compareTo(N arg0) { 
      if (arg0.z.equals(z)) 
       return 0; 
      return 1; 
     } 

    } 

    public void dostuff() { 
     HashMap m = new HashMap(); 

     N n = new N(); 
     n.z = "1"; 

     N n2 = new N(); 
     n2.z = "1"; 

     m.put(n, "one"); 
     m.put(n2, "two"); 

      // will print refs to two instances! - wrong 
     Iterator it = m.keySet().iterator(); 
     while (it.hasNext()) { 
      System.err.println(it.next()); 
     } 
    } 

回答

4

你需要重寫equalshashCode - HashMap不使用compareTo,這意味着排序

請注意,您的compareTo實施已被破壞,因爲它確實是只有測試是否相等。特別是,x.compareTo(y)y.compareTo(x)二者返回1違反compareTo合同:

實現程序必須確保的sgn(則x.compareTo(Y))== -sgn(y.compareTo(X))的所有x和y。

+0

不錯的抓,我沒有實現的compareTo()是對象之間建立 – Saideira 2011-05-26 15:54:50

+0

ORDER @Saideira:關鍵是閱讀文檔:「這個接口規定了實現它的每個類的對象進行整體排序。」 ;) – 2011-05-26 16:07:15