【问题标题】:How can I check if there's element in my arraylist that is not in the hashmap?如何检查我的数组列表中是否有不在哈希图中的元素?
【发布时间】:2019-07-14 04:33:16
【问题描述】:

我在java 中有一个List<String>,它包含一些字符串。

我还有一个 hashmapString 值,我想检查我的 List 中是否有任何元素不在 Hashmap 中。这是我写的代码:

List<String> someStrings = fetchData();
if (someStrings.stream().noneMatch(s -> myHashMap.containsValue(s))) {
    return false;
} 
return true;

但它不能正常工作。你能帮我解决这个问题吗?

【问题讨论】:

  • 请提供HashMap对象类型>

标签: java collections java-8 java-stream


【解决方案1】:

鉴于你的情况

如果我的 List 中有任何元素不在 Hashmap 中

您可以在遍历元素列表时使用anyMatch 来检查其中是否有任何元素不存在于哈希映射值中。

return someStrings.stream().anyMatch(val -> !myHashMap.containsValue(val))

或者将其视为someStrings 的所有元素都存在于 hashmap 值中

return someStrings.stream().allMatch(myHashMap::containsValue);

类似的检查也可以在 Collection 的值上使用 containsAll

return myHashMap.values().containsAll(someStrings);

【讨论】:

  • 谢谢,我喜欢containsAll 方法,我只是注意到当someStrings 中添加一个空字符串时它不起作用(在这种情况下containsAll 似乎返回true,即使我的哈希图中没有空值)。你知道如何预防吗?
  • @randomuser1 如果你的意思是var someStrings = List.of("", "alpha","beta")var mapValues = List.of("alpha","beta"),那么它肯定会返回false。我可以确认测试它。
  • 请记住,someStrings.stream().anyMatch(val -&gt; !myHashMap.containsValue(val))myHashMap.values().containsAll(someStrings) 的反义词...
  • 你可以从字面上阅读你的代码,anyMatch(val -&gt; !myHashMap.containsValue(val)) 检查 any 元素是否 包含 b>价值。这与是否包含所有内容相反。当然,这是一个使用消除过程的可行测试。它只是传递相反的值,所以在整个表达式之前的 ! 会产生相同的值。或者只是使用allMatch(val -&gt; myHashMap.containsValue(val)),现在不用否定,可以写成allMatch(myHashMap::containsValue)allMatch(myHashMap.values()::contains)...
  • 嗯,是的,这是同一测试的两个方面,您可以相应地使用任一结果,但由于 OP 似乎对List.of("") 的结果感到困惑,我只是想提醒一下关于相反的值,以确保 OP 在测试时不会忽略那个小细节。
【解决方案2】:

不需要流,你可以使用旧的Collection#removeAll()

Set<String> copy = new HashSet<>(someStrings);
copy.removeAll(myHashMap.values());

现在copy 将包含myHashMap 中未包含的所有值。然后你可以对它们做一些事情(比如迭代)或者只是调用Collection#isEmpty()来检查是否所有的都包含在地图中

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 2010-09-08
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2020-04-08
    • 2010-12-21
    相关资源
    最近更新 更多