如果我有HashMap hashM
,则为ArrayList arrayL
。如果我想使用if语句检查hashM
是否包含arrayL
中的所有元素,我该怎么做?
我目前正在使用像
这样的东西 if (hashM.values().containsAll(arrayL.getPreReqs()))
然而它无法正常工作。
非常感谢您的回答!
实际上包含所有工作但是我构造我的代码的方式是错误的,所以我得到了错误的结果。现在已经修复了。
干杯!
答案 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}