地图中的复合键

时间:2011-05-26 15:47:25

标签: java

你好我找不到任何关于我需要做什么的信息才能使两个键看起来相等。也就是说,我需要提供一个将由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());
        }
    }

1 个答案:

答案 0 :(得分:4)

您需要覆盖equalshashCode - HashMap不使用compareTo,这意味着排序

请注意,您的compareTo实施已经被破坏,因为它实际上只是 测试是否相等。特别是,x.compareTo(y)y.compareTo(x) 两者返回1违反了compareTo的合同:

  

实现者必须确保所有x和y的sgn(x.compareTo(y))== -sgn(y.compareTo(x))。