Java 向映射中已存在的键的列表中添加值

Java 向映射中已存在的键的列表中添加值,java,arraylist,hashmap,Java,Arraylist,Hashmap,晚上好 我有以下地图: HashMap<String, ArrayList> myMap = new HashMap<String, ArrayList>(); 这给我留下了以下数据: 键:测试 值:测试1、测试2、测试3 我的问题是,如何在现有密钥上添加新值?例如,如何将值“test4”添加到键“Tests”上 谢谢。只需从地图中获取列表,然后将元素添加到列表中: ArrayList list = myMap.get("Tests"); list.add("Test

晚上好

我有以下地图:

HashMap<String, ArrayList> myMap = new HashMap<String, ArrayList>();
这给我留下了以下数据:

键:测试


值:测试1、测试2、测试3

我的问题是,如何在现有密钥上添加新值?例如,如何将值“test4”添加到键“Tests”上


谢谢。

只需从地图中获取列表,然后将元素添加到列表中:

ArrayList list = myMap.get("Tests");
list.add("Test4");
关于您的代码,还有其他一些值得注意的地方。首先,
ArrayList
。使用泛型:

HashMap<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();

ArrayList<String> myList = new ArrayList<String>();
myList.add("Test 1");
myList.add("Test 2");
myList.add("Test 3");
myMap.put("Tests", myList);
最后,一个语法提示:如果您使用的是Java 7或更高版本,则可以使用
,而不必重复类型参数:

Map<String, List<String>> myMap = new HashMap<>();

List<String> myList = new ArrayList<>();
myList.add("Test 1");
myList.add("Test 2");
myList.add("Test 3");
myMap.put("Tests", myList);

myMap.get("Tests").add("Test 4");
Map myMap=newhashmap();
List myList=new ArrayList();
添加myList.add(“测试1”);
添加myList.add(“测试2”);
添加myList.add(“测试3”);
myMap.put(“测试”,myList);
myMap.get(“测试”).add(“测试4”);

我建议使用
Map#computeIfAbsent
,以确保始终从映射中检索
列表

private final Map<String, List<String>> example = new HashMap<>();

private List<String> getList(String key) {
    return this.example.computeIfAbsent(key, k -> new ArrayList<>());
}

//elsewheres
getList("test").add("foobar");
getList("test").forEach(System.out::println); // "foobar"
private final Map example=new HashMap();
私有列表getList(字符串键){
返回这个.example.computeIfAbsent(key,k->newArrayList());
}
//其他地方
获取列表(“测试”)。添加(“foobar”);
getList(“test”).forEach(System.out::println);//“foobar”
这意味着,如果映射不包含
键的条目,它将使用提供的lambda为键生成新值并返回该值。

import java.util.*;
import java.util.*;

class M {
    public static void main( String ... args ) {
        List<String> l = new ArrayList<>();
        l.add("Test 1");
        l.add("Test 2");
        l.add("Test 3");

        Map<String,List<String>> m = new HashMap<>();
        m.put("Tests", l );

        // some time later that day ... 
        m.computeIfAbsent("Tests", k -> new ArrayList<>()).add("Test 4");
        System.out.println(m);
    }
}
M类{ 公共静态void main(字符串…参数){ 列表l=新的ArrayList(); l、 添加(“测试1”); l、 添加(“测试2”); l、 添加(“测试3”); Map m=新的HashMap(); m、 put(“测试”,l); //那天晚些时候。。。 m、 computeIfAbsent(“测试”,k->new ArrayList())。添加(“测试4”); 系统输出打印项次(m); } }
myMap.get(“Tests”).add(“test4”)
为什么您的
ArrayList
是原始类型?对于下一个问题“为什么我用不同的键得到了一个
NullPointerException
”。@BoristeSpider哇,我不知道这个。它是在Java8中引入的吗?对于
put
?@dabadaba也有类似的版本,是的,因为它有一个lambda。
put
的那一个具体做什么?@boristesspider你确定
getOrDefault
可以接受供应商吗。没有超载。非常感谢大家的帮助!我会确保遵循这些信息。但这就是把价值放在地图上,对吗?如果我们使用getter方法,我不确定我是否喜欢将数据放入集合中的想法。如果没有,它会放置值,想法是您正在默认设置。如果资源对您不可用,它将使其可用并提供新资源。完全正确。我喜欢一行(倒数第二行)。
private final Map<String, List<String>> example = new HashMap<>();

private List<String> getList(String key) {
    return this.example.computeIfAbsent(key, k -> new ArrayList<>());
}

//elsewheres
getList("test").add("foobar");
getList("test").forEach(System.out::println); // "foobar"
import java.util.*;

class M {
    public static void main( String ... args ) {
        List<String> l = new ArrayList<>();
        l.add("Test 1");
        l.add("Test 2");
        l.add("Test 3");

        Map<String,List<String>> m = new HashMap<>();
        m.put("Tests", l );

        // some time later that day ... 
        m.computeIfAbsent("Tests", k -> new ArrayList<>()).add("Test 4");
        System.out.println(m);
    }
}