如何检查HashMap是否具有ArrayList的所有元素?

时间:2014-01-04 14:24:41

标签: java collections arraylist hashmap

如果我有HashMap hashM,则为ArrayList arrayL。如果我想使用if语句检查hashM是否包含arrayL中的所有元素,我该怎么做?

我目前正在使用像

这样的东西

if (hashM.values().containsAll(arrayL.getPreReqs()))

然而它无法正常工作。

非常感谢您的回答!

实际上包含所有工作但是我构造我的代码的方式是错误的,所以我得到了错误的结果。现在已经修复了。

干杯!

4 个答案:

答案 0 :(得分:2)

给出

Map<?,?> map = new HashMap<?,?>();
List<?> list = new ArrayList<?>();

你尝试的方法(好吧,差不多,as pointed out by Marko Topolnik)确实是正确的:

if (map.values().containsAll(list)) { ... }

(或map.keySet().containsAll(list)如果您对地图感兴趣而不是。)

为了使其能够按预期的方式使用自定义类型,您当然必须正确实施 equals()hashcode() 。 (例如,请参阅this question或更好,请阅读Effective Java中的第9项。)

顺便说一下,在使用Java Collections时,最好使用 interfaces (例如List,Set,Map)定义字段和变量,而不是实现类型(例如ArrayList,HashSet) ,HashMap)。例如:

List<String> list = new ArrayList<String>();
Map<Integer, String> map = new HashMap<Integer, String>();

同样,对于您的问题,更“正确”或更流畅的标题是“如何检查 Map 是否具有 List 的所有元素?”。查看Java Collections tutorial了解详情。

答案 1 :(得分:1)

你的代码是正确的,除了..

if(hashMAP.values()。containsAll(array)){....}

<强> [编辑] 您可以使用HashMap.containsValue(Object value)

public boolean containsList(HashMap<K, V> map, List<V> list) {
    for(V value : list) {
       if(!map.containsValue(value)) {
          return false;
       }
    }
    return true;
}

答案 2 :(得分:0)

您的代码应该有效 - 但效率不高。您需要将列表中的每个元素与地图中的每个元素进行比较。

如果(且仅当)您可以轻松地从元素中提取地图的关键字,那么您最好循环浏览List,并且对于每个元素执行map.containsKey(getKey(elem)),这将会更多更快。

如果您正在进行这种比较,并且无法从元素映射到键,那么可能值得为此目的保留值的HashSet。

答案 3 :(得分:-1)

我同意JoniK的观点。这可以在一行中完成。

if(hashM.values().containsAll(arrayL)) {// put your code here that will be returned}