如何向地图内的集添加值?[已关闭]

2022-09-04 06:02:58

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


例如:

键是:“苹果”,“橙子”,“葡萄”等,
每组将包含随机数:1-9

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


答案 1

要记住的是,该值最初将为 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()nullNullPointerException

有一种方法可以通过内化映射内的空检查来使您的映射非常方便使用,以便调用将始终返回非空集;创建一个匿名类,该类将相应地重写: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);

对于空值安全检查:

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

答案 2

如果我理解正确,并不难。

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