如何在Map中为Set添加值?

use*_*203 9 java dictionary key hashmap set

我有这张地图Map<String, Set<Integer>> myMap;,现在我需要与它互动,我该怎么做?


例如:

键是: "apple","orange","grape"等.
每组都包含随机数: 1-9

我需要创建一个Map(HashMap或TreeMap),它具有键的字符串和值的设置.我需要返回给定键的集合.我还需要能够根据密钥为每个集合填充多个数字.不知道如何解决这个问题.有什么想法吗?

小智 13

如果我理解正确就不难.

Map<String, Set<Integer>> reqdMap = new HashMap<String, Set<Integer>>();

//Form the set corresponding to apple.
Set<Integer> appleSet = new HashSet<Integer>();
appleSet.add(1);
...


reqdMap.put("apple", appleSet);

//To Retrieve
appleSet = reqdMap.get("apple");
Run Code Online (Sandbox Code Playgroud)


Boh*_*ian 10

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

Map<String,Set<Integer>> map;  
Run Code Online (Sandbox Code Playgroud)

要为密钥添加数字,您必须执行以下操作:

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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,无论您在哪里与集合进行交互,都必须进行空检查.例如,如果要检查某个键是否映射了某个键,则无法安全地执行此操作:

if (map.get(key).contains(number))  // not safe
Run Code Online (Sandbox Code Playgroud)

因为呼叫get()可能会返回null(如果密钥没有条目),你就会得到一个NullPointerException.

有一种方法可以通过内部化地图中的空检查来使地图使用起来非常方便,因此调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,您的主要代码变得更加简单和清晰.加上:

map.get(key).add(number);
Run Code Online (Sandbox Code Playgroud)

去检查:

if (map.get(key).contains(number)) // now safe
Run Code Online (Sandbox Code Playgroud)

不再需要空检查代码.

-

Java 8更新:

要在添加到集合时处理空条目问题,请执行以下操作:

map.computeIfAbsent( key, k -> new HashSet<>() ).add(number);
Run Code Online (Sandbox Code Playgroud)

并且用于空安全检查:

if ( map.getOrDefault(key, Collections.emptySet() ).contains(number))
Run Code Online (Sandbox Code Playgroud)