我有一个自定义类,例如,让我们说它是没有顺序的元组.
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正确比较值.
| 归档时间: |
|
| 查看次数: |
6075 次 |
| 最近记录: |