如果值是ArrayLists,是否可以将值方法用于HashMap?

时间:2012-05-15 14:24:54

标签: java arraylist hashmap

我一直试图让某些东西在作业中发挥作用。我有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的值方法。

非常感谢任何帮助。

7 个答案:

答案 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。