我有一个包含HashMaps
的List
。列表中的每个 HashMap
可能有多个 key/value
对。我想 indexOf
在列表中找出传入的 HashMap 所在元素的索引。但是,问题是 e quals method of HashMap比较时查看整个 entrySet
。这不是我想要的。
例子:
List<HashMap> benefit = new ArrayList<HashMap>();
HashMap map1 = new HashMap();
map1.put("number", "1");
benefit.add(map1);
HashMap map2 = new HashMap();
map2.put("number", "2");
map2.put("somethingelse", "blahblah"); //1
benefit.add(map2);
HashMap find = new HashMap();
find.put("number", "2");
int index = benefit.indexOf(find);
if (index >= 0)
System.out.println(benefit.get(index).get("number"));
由于 //1
行,以上代码不会打印任何内容。
- 我必须做什么才能使上面的代码实际打印
2
? - 有没有办法在列表上实现可比性,以便我可以定义 我自己的?
最佳答案
我想你正在寻找 retainAll()
,所以你可以只比较你感兴趣的元素:
int index = myIndexOf(benefit, find);
...
static int myIndexOf(List<HashMap> benefit, Map find) {
int i = 0;
for (Map map : benefit) {
Map tmp = new HashMap(map);
tmp.keySet().retainAll(find.keySet());
if (tmp.equals(find)) {
return i;
}
i++;
}
return -1;
}
当然,您可以声明自己的 List 子类,用这种行为覆盖 indexOf 方法。但是,我认为这不是一个好主意。它会违反 indexOf 方法的约定:
returns the lowest index i such that (o==null ? get(i)==null : o.equals(get(i)))
这会让维护代码的其他人感到困惑。然后您可能会认为您可以将 HashMap 子类化以重新定义 equals,但这会违反 Object.equals() 的对称属性。
关于java - 如何在包含具有多个键/值对的 HashMap 的列表上使用 indexOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9009491/