我想知道如何检查重复数据到二维地图。 问题是关于此示例代码
Pair<Integer, String> pair1 = new Pair<Integer, String>();
pair1.First = 1;
pair1.Second = "A";
Pair<Integer, String> pair2 = new Pair<Integer, String>();
pair2.First = 1;
pair2.Second = "A";
Map<Pair<Integer, String>, Double> map
= new HashMap<Pair<Integer,String>, Double>();
map.put(pair1, 0.0);
System.out.println(map.keySet().contains(pair2));
System.out.println(map.containsKey(pair2));
System.out.println(map.get(pair2)!=null);
为什么输出:
false
false
false
? 如何检查重复项? 提前致谢
答案 0 :(得分:0)
我怀疑你的配对类没有正确定义equals()
和hashCode()
。
如果Pair
定义如下:
public class Pair<T, U>{
T First;
U Second;
}
然后你会看到你得到的结果。默认情况下,java使用对象标识作为它的相等比较,因此即使它们具有相同的内容,两个不同的对也将是不相等的。您可以覆盖equals
和hashCode
,以便提供更有意义的比较。
public class Pair<T, U>{
T First;
U Second;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Pair<?, ?> pair = (Pair<?, ?>) o;
if (First != null ? !First.equals(pair.First) : pair.First != null) {
return false;
}
return !(Second != null ? !Second.equals(pair.Second) : pair.Second != null);
}
@Override
public int hashCode() {
int result = First != null ? First.hashCode() : 0;
result = 31 * result + (Second != null ? Second.hashCode() : 0);
return result;
}
}
与代码一起使用时会生成:
true
true
true
答案 1 :(得分:0)
因为您在pair1.equals(pair2)
类中隐式使用方法java.lang.Object
比较。定义如下:
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
(Java 8 API
)
由于您的Pair
课程未覆盖.hashCode()
和.equals(Object other)
方法=&gt;比较x == y
返回false
。
这样可行:
public class NewClass {
static class Pair<I,S>{
private I First;
private S Second;
@Override
public int hashCode(){
return First.hashCode() + 23*Second.hashCode();
}
@Override
public boolean equals(Object other){
Pair<I, S> otherPair = (Pair<I, S>) other;
return (this == null ? otherPair == null : (this.First == otherPair.First && this.Second == otherPair.Second));
}
}
public static void main(String[] args) {
Pair<Integer, String> pair1 = new Pair<Integer, String>();
pair1.First = 1;
pair1.Second = "A";
Pair<Integer, String> pair2 = new Pair<Integer, String>();
pair2.First = 1;
pair2.Second = "A";
Map<Pair<Integer, String>, Double> map = new HashMap<Pair<Integer,String>, Double>();
map.put(pair1, 0.0);
System.out.println(pair1.equals(pair2));
System.out.println(map.containsKey(pair2));
}
}