检查映射中与 Java 中的列表内容匹配的键

2022-09-04 02:33:55

我有一个的和一个.映射中的每个键都需要显示在列表中,否则我需要引发异常。截至目前,我正在循环列表并检查密钥,如果映射不包含密钥,则引发异常。下面是我正在做的示例代码。在Java8中,有没有其他方法可以在一行或使用和中完成?ListStringsMapstreamsfilters

列表中的内容和地图中的键也应该匹配。我已经在单独的if条件下处理。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestClass {

    public static void main(String[] args) {

        List<String> ll = new ArrayList<>();
        Map<String, Integer> m = new HashMap<>();
        ll.add("a");
        ll.add("b");
        ll.add("d");

        m.put("a", 1);
        m.put("b", 1);
        m.put("c", 1);

        if(ll.size() != m.size){
       System.out.println("Throw Exception");
         }

        for(String s : ll) {

            if(!m.containsKey(s)) {
                System.out.println("Throw Exception");
            }
        }
    }
}

答案 1

映射中的每个键都需要显示在列表中,否则我需要引发异常

您可以使用 Stream.anyMatch 执行此操作,并作为(为可读性目的更新变量名称)对地图进行迭代:keyset

if(map.keySet().stream().anyMatch(key -> !list.contains(key))) {
    throw new CustomException("");
}

更好,尽可能简单,使用List.containsAll

if(!list.containsAll(map.keySet())) {
    throw new CustomException("");
} 

要点: 如果您可以换取空间来降低运行时的复杂性,则可以创建 out of your,然后执行查找。它将降低运行时的复杂性,实现将如下所示:O(n)HashSetListO(n^2)O(n)

Set<String> allUniqueElementsInList = new HashSet<>(list);
if(!allUniqueElementsInList.containsAll(map.keySet())) {
    throw new CustomException("");
}

答案 2

我们可以尝试将列表添加到一个集合中,然后将该集合与哈希映射中的键集进行比较:

List<String> ll = new ArrayList<>();
ll.add("a");
ll.add("b");
ll.add("d");

Map<String, Integer> m = new HashMap<>();
m.put("a", 1);
m.put("b", 1);
m.put("c", 1);

Set<String> set = new HashSet<String>(ll);

if (Objects.equals(set, m.keySet())) {
    System.out.println("sets match");
}
else {
    System.out.println("sets do not match");
}

推荐