检查地图中存在的值列表的最佳方法

时间:2019-05-15 20:05:43

标签: java dictionary collections java-8 hashmap

我有一个Collection,其中包含一些值。

Collection<String> myList = new ArrayList<String>();
myList.add("a");
myList.add("b");
myList.add("c");

我创建了一个Map,其中包含一些值:

Map<String, String> myMap = new HashMap<String, String>();
myMap.put("r", "r");
myMap.put("s","m");
myMap.put("t", "n");
myMap.put("a", "o");

我想检查列表中的值是否作为键出现在地图中?我知道使用Java的方式是遍历列表,并使用myMap.containsKey()检查地图是否包含该特定值。我想知道是否有使用流或for-each的东西,这可以节省代码行或执行该操作的有效方式!感谢您仔细考虑。

编辑: 我想存储myList中不存在的所有myMap中存在的元素。因此我的输出可以是列表,例如在这种情况下[b,c]

4 个答案:

答案 0 :(得分:2)

Set<String> mySet = new HashSet<String>(myList);
myMap.keySet().containsAll(set);

这能回答您的问题吗?

编辑后:鉴于以上所述,您可以使用以下问题之一的答案来获得两组键的区别:-What is the best way get the symmetric difference between two sets in java?Getting the difference between two sets

答案 1 :(得分:1)

  

...列表中的值是否作为键出现在地图中?

据我所知,您需要验证myList中的 all 元素是否作为myMap的键。使用Stream::allMatch方法:

myMap.keySet().stream()
              .allMatch(myList::contains);

...等同于:

myList.keySet().containsAll(myMap);
  

编辑:我想存储myList中不存在的所有myMap中存在的元素。因此我的输出可以是一个列表,例如在这种情况下[b,c]。

您不想将所有元素都存储在myList中,因为它们已经在此处填充了。您想使用List::retainAll 保留这些元素。

myList.retainAll(myMap.keySet());

打印出myList的结果将只产生只在原始myList中找到并且还作为myMap的钥匙的钥匙

答案 2 :(得分:1)

  

对于:我想存储myList中存在的所有元素,这些元素是   在myMap中不存在。所以我的输出可以是一个列表,例如在这种情况下   [b,c]

创建重复的myList并删除所有myMap的键

        Collection<String> newList = new ArrayList<>(myList);
        newList.removeAll(myMap.keySet());
        System.out.println(newList);

答案 3 :(得分:0)

使用,您可以执行以下操作:

List<String> result = myList.stream()                
                            .filter(myMap::containsKey)
                            .collect(Collectors.toList());

结果列表将包含在地图中作为键显示的值。

如果要打印出来,可以执行以下操作:

result.forEach(System.out::println);