1

我被困在试图让一些东西在任务中发挥作用。我有一个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 的 values 方法。

任何帮助将非常感激。

4

7 回答 7

2

HashMap.values()返回一个Collection。您可以遍历集合,而无需将其转换为数组(或列表)。

for (ArrayList<Object> value : sharedLocks.values()) {
...
}
于 2012-05-15T14:31:14.590 回答
1

HashMap 有点特别,因为它根本没有索引可供参考……

你想要做的,是先把 HashMap 变成一个集合,然后用一个迭代器遍历这个集合。

每当你在 HashMap 中获得一个 ArrayList 时,你就会循环遍历 arrayList 中的每个元素,然后如果你找到它就跳出来 :)

于 2012-05-15T14:27:23.977 回答
0

使用将toArray数组作为参数的方法。

这使用您指定的数组来填充数据,并维护类型,因此您不需要进行类型转换。此外,您应该在定义中保留泛型<Object>

ArrayList<Object>[] values =
     sharedLocks.values().toArray(new ArrayList<Object>[sharedLocks.size()]);

要考虑的另一件事是多个线程是否可以修改 this HashMap。在这种情况下,您需要将这行代码同步到HashMap并确保所有修改也同步。这将确保其他线程不会修改.size()调用和.toArray()调用之间的内容,这是可能的。

于 2012-05-15T14:27:10.717 回答
0

你不需要数组:

boolean valueExists = false;
for (ArrayList<Object> value : sharedLocks.values()) {
    if (value.contains(accessedObject)) {
        valueExists = true;
        break;
    }
}
于 2012-05-15T14:27:23.657 回答
0

为什么不遍历地图中的所有值:

for (ArrayList<Object> list : sharedLocks) {
  if (list.contains(accessedObject)) {
    // ...
  }
}
于 2012-05-15T14:28:23.277 回答
0

这是一个通过哈希映射进行迭代的示例的链接。使用它来拉出每个数组列表,然后将其扩展为然后在数组列表的每个元素中搜索给定条目。

http://www.java-examples.com/iterate-through-values-java-hashmap-example

于 2012-05-15T14:29:01.920 回答
0

您将需要使用嵌套的 foreach 循环。

foreach(every element in the hashmap) {
 foreach(every element in arraylist) {
   // do comparision
 }
}

你可能只是摆脱了一个 foreach 循环和一个 keyExists() 调用或其中的一些东西。我无法从脑海中回忆起 API。

于 2012-05-15T14:30:18.663 回答