0

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

        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

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

4

2 回答 2

0

我怀疑你的 pair 类没有定义equals()hashCode()正确。

如果Pair是这样定义的:

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

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

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
于 2015-11-19T18:11:19.723 回答
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)方法 => 比较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));
}
}
于 2015-11-19T18:17:46.000 回答