Java 如何向地图内的集合添加值?

Java 如何向地图内的集合添加值?,java,dictionary,hashmap,set,key,Java,Dictionary,Hashmap,Set,Key,我有这张地图map我的地图,现在我需要与它交互,我该怎么做 例如: 键是:“苹果”、“橘子”、“葡萄”等 每组将包含随机数:1-9 我需要创建一个映射(HashMap或TreeMap),其中包含键的字符串和值的集合。给我一把钥匙,我需要把电视机还回去。我还需要能够填写一个键为基础的多个数字的每个集。不知道如何处理这个问题。有什么想法吗?地图; Map<String,Set<Integer>> map; Set<Integer> set = map.get

我有这张地图
map我的地图,现在我需要与它交互,我该怎么做


例如: 键是:“苹果”、“橘子”、“葡萄”等
每组将包含随机数:1-9

我需要创建一个映射(HashMap或TreeMap),其中包含键的字符串和值的集合。给我一把钥匙,我需要把电视机还回去。我还需要能够填写一个键为基础的多个数字的每个集。不知道如何处理这个问题。有什么想法吗?

地图;
Map<String,Set<Integer>> map;  
Set<Integer> set = map.get("apple");  
Set=map.get(“苹果”);
我省略了
map
的实际填充,因为OP是如何
获取集,即值
map mapOfSets=new HashMap();
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");
Set numberSet=newhashset(); //在地图上画一组 设置的地图(“键”,数字集); //从地图上划出一组 Set=mapOfSets.get(“key”);
如果我理解正确,这并不难

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");
Map reqdMap=newhashmap();
//形成与苹果对应的集合。
Set appleSet=new HashSet();
添加(1);
...
需求地图放置(“苹果”,苹果集);
//取回
appleSet=reqdMap.get(“苹果”);

如果要使用一种方法向一个集合中添加多个数字,请尝试以下操作:

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


public void addValues(String key, Integer... values) {
    map.get(key).addAll(values);
}
一行而不是5行。

为什么不看看这个:

MultiMap
允许您以非常高效的方式存储给定键的多个值

在您的情况下,最大的优点是您不必为了向给定键添加一些值而从给定键检索值(
Set


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

这只是一个完整类的示例。只需运行它并对其进行操作,以了解更多有关此问题的信息

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

    }

}
公共类测试员5{
/**
*@param args
*/
公共静态void main(字符串[]args){
//“苹果”、“橘子”、“葡萄”等。每组将包含随机数:1、2、3、4、5、6、7、8、9
Random ran=新的Random();
Map Map=newhashmap();
字符串键[]={“苹果”、“橙色”、“葡萄”};
用于(字符串键:键){
Set integers=new HashSet();
对于(int i=0;i<10;i++){
整数.add(ran.nextInt(9)+1);
}
map.put(键,整数);
}
System.out.println(map.toString());
}
}

需要记住的是,该值最初为空,因此首次使用密钥时,必须对其进行初始化:

Map<String,Set<Integer>> map;  
因为对
get()

有一种方法可以使映射非常方便地使用,方法是在映射内部内化空检查,这样对
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;
    }
}
检查:

if (map.get(key).contains(number)) // now safe
空检查代码不再是必需的

--

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

map.computeIfAbsent( key, k -> new HashSet<>() ).add(number);

阅读有关
Set
接口及其实现的文档。这同样适用于
Map
。您能给出一个用户输入和预期输出的示例吗?您的地图应该是
地图
,至于地图或集合本身,请参阅文档。特别是map的
put
get
方法以及set的
add
方法。您可能希望从Guava开源库中查看接口及其实现。您可能可以直接使用这个库,或者至少看一下他们的代码,以了解如何使用这种类型的数据结构;
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);
if ( map.getOrDefault(key, Collections.emptySet() ).contains(number))