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