Java 检查二维地图中的重复项

Java check for duplicates into bidimensional map

我想知道如何在二维地图中检查重复项。 问题是关于这个示例代码

        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

? 如何检查重复项? 提前致谢

我怀疑你的对 class 没有正确定义 equals()hashCode()

如果Pair是这样定义的:

public class Pair<T, U>{
    T First;
    U Second;
}

然后你就会看到你得到的结果。默认情况下 java 使用对象标识作为相等比较,因此即使两个不同的对具有相同的内容,它们也会不相等。您可以覆盖 equalshashCode 以提供更有意义的比较。

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

因为您在 java.lang.Object class 中隐含地使用了方法 pair1.equals(pair2) 比较。定义为:

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 class 不会覆盖 .hashCode().equals(Object other) 方法 => 比较 x == y return 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));
}
}