我有这张地图Map<String, Set<Integer>> myMap;
,现在我需要与它互动,我该怎么做?
<小时/>
键是:“apple”,“orange”,“grape”等。
每套都包含随机数: 1-9
我需要创建一个Map(HashMap或TreeMap),它具有键的键和值的字符串。我需要返回给定键的集合。我还需要能够根据密钥为每个集合填充多个数字。不知道如何解决这个问题。有什么想法吗?
答案 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
不再需要空检查代码。
-
在添加到集合时处理空条目问题:
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());
}
}