【发布时间】:2019-01-07 13:21:07
【问题描述】:
它有点不言自明,但我该如何填写呢?
Map<Integer,ArrayList<Integer>>intMap = new HashMap<Integer, ArrayList<Integer>>();
我已经试过了
intMap.put(1, 2);
intMap.put(1, 3); etc
和
intMap.put(1, (2, 3);
【问题讨论】:
它有点不言自明,但我该如何填写呢?
Map<Integer,ArrayList<Integer>>intMap = new HashMap<Integer, ArrayList<Integer>>();
我已经试过了
intMap.put(1, 2);
intMap.put(1, 3); etc
和
intMap.put(1, (2, 3);
【问题讨论】:
你应该使用Map.computeIfAbsent:
intMap.computeIfAbsent(someKey, k -> new ArrayList<>()).add(someValue);
例如,要有这些映射:
1 -> [2, 3]
5 -> [8]
6 -> [7, 9, 4]
你可以这样做:
intMap.computeIfAbsent(1, k -> new ArrayList<>()).add(2);
intMap.computeIfAbsent(1, k -> new ArrayList<>()).add(3);
intMap.computeIfAbsent(5, k -> new ArrayList<>()).add(8);
intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(7);
intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(9);
intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(4);
编辑:
Map.computeIfAbsent 等价于这段代码:
List<Integer> list = intMap.get(someKey);
if (list == null) {
list = new ArrayList<>();
intMap.put(someKey, list);
}
list.add(someValue);
【讨论】:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
intMap.put(1, list);
list = new ArrayList<>();
list.add(4);
list.add(5);
list.add(6);
intMap.put(2, list);
【讨论】:
如果地图和列表在实例化后不可修改,则可以使用 Java 9:
Map<Integer, List<Integer>> map = Map.of(1, List.of(2, 3),
2, List.of(3, 5));
如果地图和列表是可修改的,您可以遵循 Federico Peralta Schaffner 的方法,并通过使用 var-args 提取方法使其更加用户友好:
void fill(Map<Integer, List<Integer>> map, Integer key, Integer... values) {
map.computeIfAbsent(key, k -> new ArrayList<>())
.addAll(Arrays.asList(values));
}
您现在可以轻松使用它:
Map<Integer, List<Integer>> map = new HashMap<>();
fill(map, 1, 2, 3);
fill(map, 2, 4, 6);
fill(map, 2, 1);
请注意,在 var-args 中传递 null 引用将触发 Arrays.asList(values) 中的 NullPointerException。
【讨论】:
首先,不要映射到 ArrayList。使用列表时,不要提及比列表更具体的内容,除非在您构建它的地方。您的地图没有理由不接受不同类型的列表。 (另外,如果顺序无关紧要,它应该只是一个集合,而不是一个列表。声明的东西尽可能不具体。)
上面关于使用 computeIfAbsent 的帖子是您使用地图时的正确答案。如果你只是想用几个值初始化地图,你可以这样做。
map.put(1, new ArrayList<>(Arrays.asList(2,3)));
map.put(2, new ArrayList<>(Arrays.asList(7, 9, 11)));
(根据下面的优秀评论更正。)
【讨论】:
Arrays.asList 不允许稍后将元素添加到列表中。也许你可以使用new ArrayList<>(Arrays.asList(...))。同意所有其他 cmets +1
简单,您可以尝试多种方式,例如,
Map<Integer,ArrayList<Integer>>intMap = new HashMap<Integer, ArrayList<Integer>>();
intMap.put(101,new ArrayList<Integer>().add(1));
intMap.put(102,new ArrayList<Integer>().add(2));
我猜如果每个索引有多个值,那么只有你在尝试这样做,在这种情况下我们可以这样做,
ArrayList<Integer> list1=new ArrayList<Integer>();
list1.add(1);
list1.add(2);
...
ArrayList<Integer> list2=new ArrayList<Integer>();
list2.add(1);
list2.add(2);
...
那么,
intMap.put(1,list1);
intMap.put(2,list2);
【讨论】: