2011-05-26 49 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