对于从自定义类映射的HashMap,如何使两个等效键映射到值?

A Q*_*ker 4 java

我有一个自定义类,例如,让我们说它是没有顺序的元组.

public class UnorderedTuple {  
    Integer i1 = null; Integer i2 = null;

    UnorderedTuple(Integer int1, Integer int2) { i1 = int1; i2 = int2; }

    boolean equals(UnorderedTuple t) { return t.i1 == i1 && t.i2 == t2 || t.i2 == i1 && t.i1 == i2; }
}
Run Code Online (Sandbox Code Playgroud)

就像我说的,一个愚蠢的例子.现在,让我说我有

Map<UnorderedTuple, Integer> m = new HashMap<UnorderedTuple, Integer>();
Run Code Online (Sandbox Code Playgroud)

理想情况下,我喜欢这个功能:

UnorderedTuple ut1 = new UnorderedTuple(1,2);
UnorderedTuple ut2 = new UnorderedTuple(2,1);

m.put(ut1,2);
m.put(ut2,3);
System.out.println(m.get(ut1)==3); //ideally returns true
Run Code Online (Sandbox Code Playgroud)

有什么我需要实现或扩展,以便我可以拥有此功能?以同样的方式,如果您使用2个不同但相等的字符串,或整数,或任何作为键,它将正确映射它,但如果我按照写入实现它,它将分别处理ut1和ut2.即使我构造ut1和ut2相同,它也会做同样的事情.

谢谢你的帮助.

Jon*_*eet 19

您需要覆盖hashCode()...在这种情况下,您可能通过对所涉及的所有字段的哈希码进行异或来实现,以获得您想要的顺序独立性.

您还需要覆盖equals(Object)而不仅仅是实现equals(UnorderedTuple).

我还注意到你使用"=="比较实例Integer:不要这样做.它会在你给出的测试用例中起作用,因为有关拳击的规则,但如果你尝试使用超过127的值,你可能会遇到问题 - 它只是比较引用而不是.要求equals正确比较值.