晚间!
我有以下地图:
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”键上。
感谢。
答案 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);
其次,编程接口,而不是实现。换句话说,使用接口Map
和List
而不是实现HashMap
和ArrayList
进行编程。这是一个众所周知的面向对象编程原则,例如,如果需要,它可以更容易地切换到不同的实现。
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);
}
}