如何在Map中为Set添加值?

时间:2013-04-03 20:28:51

标签: java dictionary hashmap set key

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

<小时/>

例如:

键是:“apple”,“orange”,“grape”等。
每套都包含随机数: 1-9

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

7 个答案:

答案 0 :(得分:11)

如果我理解正确就不难。

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");

答案 1 :(得分:9)

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

Map<String,Set<Integer>> map;  

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

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(如果该密钥没有条目),那么您将获得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;
    }
}

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

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))

答案 2 :(得分:4)

为什么不看这个:

https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap

MultiMap允许您以非常有效的方式为给定密钥存储多个值。

在您的情况下,最大的好处是您不必从给定键中检索值(Set)以向其添加一些值。

实际上,您只需将值添加到键中,就像处理“monovalue”一样,它将自动添加到后台的set

答案 3 :(得分:0)

Map<String,Set<Integer>> map;  
Set<Integer> set = map.get("apple");  

我省略map的实际人口,因为OP是如何get该集合,即值

答案 4 :(得分:0)

Map<String, Set<Integer>> mapOfSets = new HashMap<String, Set<Integer>>();
Set<Integer> numberSet = new HashSet<Integer>();

//put a set into the map
mapOfSets.put("key", numberSet);
//get a set out of the map
Set<Integer> set = mapOfSets.get("key");

答案 5 :(得分:0)

如果您想使用一种方法为一组添加多个数字,请尝试以下方法:

Map<String, Set<Integer>> map; // Definition


public void addValues(String key, Integer... values) {
    map.get(key).addAll(values);
}

这样,当你需要为一个键添加一堆数字时,你可以像这样打个电话:

addValues("apple", 1, 2, 4, 6, 8);

一行而不是五行。

答案 6 :(得分:0)

这只是一个完整的例子。只需运行它并继续操作以了解有关此问题的更多信息

public class Tester5 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //"apple", "orange", "grape", etc. Each set will contain random numbers: 1, 2, 3, 4, 5, 6, 7, 8, 9

        Random ran = new Random();

        Map<String, Set<Integer>> map= new HashMap<String, Set<Integer>>();
        String keys[]= {"apple", "orange", "grape"};
        for(String key : keys) {
            Set<Integer> integers= new HashSet<Integer>();
            for(int i = 0; i < 10; i++) {
                 integers.add(ran.nextInt(9)+1);
            }
            map.put(key, integers);
        }
        System.out.println(map.toString());

    }

}