我一直试图让某些东西在作业中发挥作用。我有HashMap<Integer, ArrayList<Object>>
名为sharedLocks
,我想检查是否可以在HashMap中的任何ArrayList中找到某个值。
以下代码显然不起作用,因为Object[]
无法转换为ArrayList[]
,但它是我想要的一般功能的演示。
ArrayList[] values = (ArrayList[]) sharedLocks.values().toArray();
boolean valueExists = false;
for (int i = 0; i < values.length; i++) {
if (values[i].contains(accessedObject)) {
valueExists = true;
}
}
有没有办法让我检查HashMap中的每个ArrayList一定的值?在这种情况下,我不确定如何使用HashMaps的值方法。
非常感谢任何帮助。
答案 0 :(得分:2)
HashMap.values()
返回Collection
。您可以遍历集合而无需将其转换为数组(或列表)。
for (ArrayList<Object> value : sharedLocks.values()) {
...
}
答案 1 :(得分:1)
HashMap有点特殊,因为它根本没有索引......
你想要做的是首先将HashMap转换为集合,然后使用迭代器迭代集合。
每当你在HashMap中获得一个ArrayList时,你循环遍历arrayList中的每个元素,然后如果你找到它就跳出来:)
答案 2 :(得分:0)
使用以数组作为参数的toArray
方法。
这使用您指定的数组来填充数据,并维护输入,因此您无需进行类型转换。此外,您应该在定义中保留通用<Object>
。
ArrayList<Object>[] values =
sharedLocks.values().toArray(new ArrayList<Object>[sharedLocks.size()]);
还有一件事需要考虑,即多个线程是否可以修改此HashMap
。在这种情况下,您需要将此行代码同步到HashMap
,并确保所有修改也同步。这将确保其他线程不会修改.size()
呼叫和.toArray()
呼叫之间的内容,这是可能的。
答案 3 :(得分:0)
你不需要数组:
boolean valueExists = false;
for (ArrayList<Object> value : sharedLocks.values()) {
if (value.contains(accessedObject)) {
valueExists = true;
break;
}
}
答案 4 :(得分:0)
为什么不迭代地图中的所有值:
for (ArrayList<Object> list : sharedLocks) {
if (list.contains(accessedObject)) {
// ...
}
}
答案 5 :(得分:0)
表示通过哈希映射迭代的示例的链接。使用它来拉出每个arraylist,然后将其扩展为然后搜索给定条目的数组列表中的每个元素。
http://www.java-examples.com/iterate-through-values-java-hashmap-example
答案 6 :(得分:0)
您将需要使用嵌套的foreach循环。
foreach(every element in the hashmap) {
foreach(every element in arraylist) {
// do comparision
}
}
你可能只是通过foreach循环和keyExists()调用或其中的某些东西逃脱。我无法回想起API。