我定义了一个简单的私有类SetOb,它包含一个int和一个Set数据结构。我在'main'方法中有一个HashMap,其中SetOb作为键,Integer作为值。现在,您可以在main方法中看到,当我用SetOb实例提供给HashMap,然后查找具有完全相同值的实例时,它将返回“ null”。在我使用自己定义的数据结构(例如SetOb作为HashMap中的Key)之前,这已经发生了好几次。有人可以指点我我想念的是什么吗?
请注意,在SetOb类的构造函数中,我复制了作为参数传递的Set。

public class Solution {

    public static Solution sample = new Solution();
    private class SetOb {
        public int last;
        public Set<Integer> st;
        public SetOb(int l , Set<Integer> si ){
            last = l;
            st = new HashSet<Integer>(si);
        }
    }

    public static void main(String[] args) {
        Map<SetOb, Integer> m = new HashMap< SetOb, Integer>();
        Set<Integer> a = new HashSet<Integer>();

        for(int i =0; i<10; i++){
            a.add(i);
        }
        SetOb x = sample.new SetOb(100, a);
        SetOb y = sample.new SetOb(100, a);
        m.put(x,500);
        Integer val = m.get(y);
        if(val!= null) System.out.println("Success: " + val);
        else System.out.println("Failure");
    }

}

最佳答案

您的xy不是相同的对象实例,因此包含的对象无法将yx匹配,最终导致在Map中找不到匹配的键/值。

如果您希望匹配成功,请在hasCode中实现(重写)equalsSetOb方法,该方法将比较字段值。

示例方法(Eclipse生成)如下:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + last;
    result = prime * result + ((st == null) ? 0 : st.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    SetOb other = (SetOb) obj;
    if (last != other.last)
        return false;
    if (st == null) {
        if (other.st != null)
            return false;
    } else if (!st.equals(other.st))
        return false;
    return true;
}

关于java - Java中的HashMap无法哈希MyObject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13225176/

10-09 12:38