Java检查重复到二维地图

时间:2015-11-19 17:46:55

标签: java hashmap compare keyvaluepair key-pair

我想知道如何检查重复数据到二维地图。 问题是关于此示例代码

        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

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

2 个答案:

答案 0 :(得分:0)

我怀疑你的配对类没有正确定义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

答案 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));
}
}