我有个问题.首先,我宣布了一张地图:
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中.谢谢.
像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()方法是过度简单化,你可能需要找到一个更好的结构,但最重要的是实现它们是我推荐的.
| 归档时间: |
|
| 查看次数: |
22765 次 |
| 最近记录: |