List<Map<String, Integer>> 遍历相加
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List<Map<String, Integer>> 遍历相加相关的知识,希望对你有一定的参考价值。
List<Map<String, Integer>> list1 = [d=2, a=3, c=1, b=1, d=21, a=34, c=12, b=13]
想让 d 、a、c、d 遍历 相加后 再放到新的 List<Map<String, Integer>> list2 里
请java高手完整代码给出来
Map<String, Integer> m1 = new HashMap<String, Integer>();
m1.put("a", 3);
m1.put("b", 1);
m1.put("c", 1);
m1.put("d", 2);
list1.add(m1);
Map<String, Integer> m2 = new HashMap<String, Integer>();
m2.put("a", 34);
m2.put("b", 13);
m2.put("c", 12);
m2.put("d", 21);
list1.add(m2);
List<Map<String, Integer>> list2 = new ArrayList<Map<String, Integer>>();
int a = 0;
int b = 0;
int c = 0;
int d = 0;
for(int i=0; i<list1.size(); i++)
Map<String, Integer> m = list1.get(i);
a += m.get("a");
b += m.get("b");
c += m.get("c");
d += m.get("d");
Map<String, Integer> m = new HashMap<String, Integer>();
m.put("a", a);
m.put("b", b);
m.put("c", c);
m.put("d", d);
list2.add(m);本回答被提问者采纳
List<Object> 到 Map<String, Map<String,List<Object>>>
【中文标题】List<Object> 到 Map<String, Map<String,List<Object>>>【英文标题】:List<Object> to Map<String, Map<String,List<Object>>> 【发布时间】:2018-09-22 18:48:58 【问题描述】:我有List<Person>
,其中Person
如下。
class Person
String personId;
LocalDate date;
String type;
// getters & setters
我正在尝试将其转换为List<Person>
到Map<String, Map<LocalDate,List<Person>>>
,其中外部映射的键是personId
,内部映射的键是date
,我不知道如何实现这一点。
到目前为止,已经尝试过类似下面的东西。也对 Java 8 解决方案开放。
Map<String,Map<LocalDate,List<Person>>> outerMap = new HashMap<>();
Map<LocalDate,List<Person>> innerMap = new HashMap<>();
for(Person p : list)
List<Person> innerList = new ArrayList<>();
innerList.add(p);
innerMap.put(p.getDate(), innerList);
outerMap.put(p.getPersonId(), innerMap);
【问题讨论】:
你应该解释你的想法。为什么在循环内声明innerList
?为什么innerMap
声明在外面?为什么outerMap
也在外面声明?
Convert a Nested List to nested Map的可能重复
【参考方案1】:
This answer 展示了如何使用流来实现,this other one 展示了如何使用传统的迭代方法来实现。这是另一种方式:
Map<String, Map<LocalDate, List<Person>>> outerMap = new HashMap<>();
list.forEach(p -> outerMap
.computeIfAbsent(p.getPersonId(), k -> new HashMap<>()) // returns innerMap
.computeIfAbsent(p.getDate(), k -> new ArrayList<>()) // returns innerList
.add(p)); // adds Person to innerList
这使用Map.computeIfAbsent
创建一个新的innerMap
,如果不存在则放入outerMap
(键为personId
),同时创建一个新的innerList
并放入@ 987654330@ 如果不存在(键是date
)。最后,将Person
添加到innerList
。
【讨论】:
很高兴知道Map.computeIfAbsent
。谢谢费德里科!【参考方案2】:
您的for
循环组织应更改为尝试从嵌套映射中获取现有List<Person>
,然后再继续创建新列表。这是一个两步过程:
Map<String,Map<LocalDate,List<Person>>> outerMap = new HashMap<>();
for(Person p : list)
Map<LocalDate,List<Person>> innerMap = outerMap.get(p.getPersonId());
if (innerMap == null)
innerMap = new HashMap<>();
outerMap.put(p.getPersonId(), innerMap);
List<Person> innerList = innerMap.get(p.getDate());
if (innerList == null)
innerList = new ArrayList<>();
innerMap.put(p.getDate(), innerList);
innerList.add(p);
【讨论】:
【参考方案3】:list.stream()
.collect(Collectors.groupingBy(
Person::getPersonId,
Collectors.groupingBy(
Person::getDate
)));
【讨论】:
以上是关于List<Map<String, Integer>> 遍历相加的主要内容,如果未能解决你的问题,请参考以下文章
如何将map<string list<>>转换成城map<string,object>
List<Object> 到 Map<String, Map<String,List<Object>>>
求教arraylist里面放map,怎么循环遍历得到map里面的数据,如:List<Map<String, String>> list = new Ar
list<String>如何转化为Map<String, Object>,list<EmpVO>如何转化为Map<String, Object>