将列表中的值添加到Map中已存在的键

时间:2016-05-09 21:09:14

标签: java arraylist hashmap

晚间!

我有以下地图:

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

然后我添加了以下数据:

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

这给我留下了以下数据:

密钥:测试

值:测试1,测试2,测试3

我的问题是,如何在我现有的密钥上添加新值?例如,我怎样才能将“Test 4”值添加到我的“Tests”键上。

感谢。

3 个答案:

答案 0 :(得分:4)

我建议您使用Map#computeIfAbsent,以确保始终确保从地图中检索List

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"

这意味着如果地图不包含key的条目,它将使用提供的lambda为密钥生成新值并返回该值。

答案 1 :(得分:3)

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

ArrayList list = myMap.get("Tests");
list.add("Test4");

您的代码还有其他一些可以评论的内容。首先,don't use the raw type 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);

其次,编程接口,而不是实现。换句话说,使用接口MapList而不是实现HashMapArrayList进行编程。这是一个众所周知的面向对象编程原则,例如,如果需要,它可以更容易地切换到不同的实现。

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

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

答案 2 :(得分:1)

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