java - 如何将值添加到 Map 中的 Set?

标签 java dictionary hashmap set key

<分区>

我有这张 map Map<String, Set<Integer>> myMap; , 现在我需要和它交互,我该怎么做?


例如:

键是:“apple”、“orange”、“grape”等
每组将包含随机数:1-9

我需要创建一个映射(HashMap 或 TreeMap),其中包含用于键的字符串和用于值的集合。我需要返回给定 key 的集合。我还需要能够根据一个键用多个数字填充每个集合。不知道如何解决这个问题。有什么想法吗?

最佳答案

需要记住的是,该值最初将为 null,因此在您第一次使用键时,您必须对其进行初始化:

Map<String,Set<Integer>> map;  

要向 key 添加数字,您必须执行以下操作:

String key = "apple"; // for example 

Set<Integer> set = map.get(key); 
if (set == null) {
    set = new HashSet<Integer>();
    map.put(key, set);
}
set.add(5);

不幸的是,在任何与集合交互的地方,都必须进行空值检查。例如,如果你想检查某个键是否映射了某个数字,你不能安全地这样做:

if (map.get(key).contains(number))  // not safe

因为对 get() 的调用可能会返回 null(如果没有 key 条目)并且您会得到一个 NullPointerException .

有一种方法可以使您的 map 使用起来非常方便,方法是将空检查内化到 map 内部,这样对 get() 的调用将始终返回一个非空集;创建一个匿名类,相应地覆盖 get():

Map<String,Set<Integer>> map = new HashMap<String,Set<Integer>> () {
    @Override
    public Set<Integer> get(Object key) {
        Set<Integer> set = super.get(key); 
        if (set == null) {
            set = new HashSet<Integer>();
            put(key, set);
        }
        return set;
    }
}

有了这个,您的主要代码就会变得更加简单和清晰。添加:

map.get(key).add(number);

检查:

if (map.get(key).contains(number)) // now safe

不再需要空检查代码。

——

Java 8 更新:

处理添加到集合时的空条目问题:

map.computeIfAbsent( key, k -> new HashSet<>() ).add(number);

和 null 安全检查:

if ( map.getOrDefault(key, Collections.emptySet() ).contains(number))

关于java - 如何将值添加到 Map 中的 Set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15797446/

相关文章:

java - HashMap 顺序在使用 Thread 时发生变化,但在没有 Thread 时保持不变

java - 响应式创建 Eclipse 上下文子菜单

java - 自定义 map 收集器

python - 如何在保留冗余值的同时将元组列表转换为字典?

swift - 如何使用 Swift 3 访问字典值?

java - 3维不同类型 map 或列表: List(ID=integer) of List(ID=integer) of int[]

java - 如何在 Java 中遍历 Map?

java - 如何使用 Intellij 配置和结构化子项目

Java:在 Windows 计算机上打印/输出彩色和格式化文本到控制台

java - 运行方法时出现很多错误