<分区>
我有这张 map Map<String, Set<Integer>> myMap;
, 现在我需要和它交互,我该怎么做?
例如:
键是:“apple”、“orange”、“grape”等
每组将包含随机数:1-9
我需要创建一个映射(HashMap 或 TreeMap),其中包含用于键的字符串和用于值的集合。我需要返回给定 key 的集合。我还需要能够根据一个键用多个数字填充每个集合。不知道如何解决这个问题。有什么想法吗?
标签 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
不再需要空检查代码。
——
处理添加到集合时的空条目问题:
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/