在Map中设置<Integer>

use*_*947 4 java

我有个问题.首先,我宣布了一张地图:

Map<TwoIntClass, Set<Integer>> m = new HashMap<TwoIntClass, Set<Integer>>();
Run Code Online (Sandbox Code Playgroud)

现在,我想把东西放在这个地图中,比如说

int num = 7;
m.put(new TwoIntClass(5, 3), ?? how to put num inside Set ??);
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何将变量num放入Set中.谢谢.

Yan*_*hon 7

Jack和其他人建议的那样,你需要实例化一个Set接口的具体实例(比如HashSet),在你的int值中添加你的值Set然后把它Set放进你的Map.但是,如果您使用的是自定义类为您Map的钥匙,我建议你实现equals()hashCode()你的方法TwoIntClass类,以确保你是不是你的内部创建重复的条目Map.例如,考虑这个类:

public class TwoIntClass {

    private int i1;
    private int i2;

    public TwoIntClass(int i1, int i2) {
        this.i1 = i1;
        this.i2 = i2;   
    }

    static public void main(String...args) {

        Map<TwoIntClass, Set<Integer>> map = new HashMap<TwoIntClass, Set<Integer>>();

        Set<Integer> dataset = new HashSet<Integer>();
        dataset.add(1);
        dataset.add(2);

        TwoIntClass i1 = new TwoIntClass(5, 3);
        TwoIntClass i2 = new TwoIntClass(5, 3);

        map.put(i1, dataset);
        map.put(i2, dataset);

        System.out.println( i1.hashCode() + " = " + i2.hashCode() + " == " + i2.equals(i2) + " > map count = " + map.size() );

        TwoIntClass i3 = new TwoIntClass(5, 3);
        System.out.println("Looking for TwoIntClass(5,3)... " + map.containsKey(i3) );

    }
}
Run Code Online (Sandbox Code Playgroud)

执行它的输出是:

1476323068 = 535746438 == false> map count = 2

寻找TwoIntClass(5,3)......假

如您所见,它们都是"相等的"(即它们都是用相同的整数构造的),但它们是具有不同哈希码的不同对象,因此在地图中创建两个条目.这可能会导致应用程序中的数据损坏.此外,执行此行:map.get(new TwoIntClass(5,3)).add(3);将生成一个NullPointerException因为键(它的哈希)在地图中不存在.因此,您需要实现equals()hashCode()方法来修复它,因此任何TwoIntClass使用相同整数构造的都将被视为相等.就像是 :

@Override
public boolean equals(Object obj) {
    if (!(obj instanceof TwoIntClass)) {
        return false;
    }
    TwoIntClass other = (TwoIntClass) obj;

    return (other.i1 == this.i1) && (other.i2 == this.i2); 
}

@Override
public int hashCode() {
    //return TwoIntClass.class.hashCode() | i1 | (i2 << 16);

    // better implementation based on the String class
    int hash = TwoIntClass.class.hashCode();

    hash = (hash * 31) + i1;
    hash = (hash * 31) + i2;

    return hash;
}
Run Code Online (Sandbox Code Playgroud)

产生更期望的结果

1476323071 = 1476323071 == true> map count = 1

寻找TwoIntClass(5,3)......是的

当然,这种hashCode()方法是过度简单化,你可能需要找到一个更好的结构,但最重要的是实现它们是我推荐的.