Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于从自定义类映射的HashMap,如何使其使两个等价键映射到say value?_Java - Fatal编程技术网

Java 对于从自定义类映射的HashMap,如何使其使两个等价键映射到say value?

Java 对于从自定义类映射的HashMap,如何使其使两个等价键映射到say value?,java,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

我有一个自定义类,比如说,它是没有顺序的元组

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; }
}
就像我说的,一个愚蠢的例子。现在,假设我有

Map<UnorderedTuple, Integer> m = new HashMap<UnorderedTuple, Integer>();
我是否需要实现或扩展某些功能,以便拥有此功能?同样,如果使用2个不同但相等的字符串或整数或其他任何键,它将正确地映射它,但如果我以书面形式实现它,它将分别处理ut1和ut2。即使我构造ut1和ut2相同,它也会做同样的事情


谢谢您的帮助。

您需要重写
hashCode()
。。。在本例中,您可能会通过对所有相关字段的散列码进行XOR运算来实现,以获得所需的顺序独立性

您还需要重写
equals(Object)
,而不仅仅是实现
equals(无序元组)

我还注意到,您正在使用“==”来比较
整数的实例:不要这样做。根据装箱规则,它将在您给出的测试用例中工作,但是如果您尝试使用超过127的值,则很可能会遇到问题-这只是比较引用,而不是值。调用
equals
以正确比较值。

实现您需要以与一致的方式实现(换句话说,如果
a.equals(b)
返回
true
,则
a.hashCode()==b.hashCode()
也必须是
true

(免费PDF!)有所有的细节


编辑:您还需要确保实际实现了
equals(Object)
。在示例代码中,您只实现了
等于(无序元组)
,这是不同的

您实现了equals()和hashCode()吗?这可能就是问题所在。链接到文档

您必须定义一个自定义哈希函数,该函数对两个元组的计算结果相同。然而,这是非常重要的,因为哈希函数在确定哈希映射的性能时非常重要

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