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高手完整代码给出来

参考技术A List<Map<String, Integer>> list1 = new ArrayList<Map<String, Integer>>();
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&lt;Person&gt;,其中Person 如下。

class Person 

    String personId;
    LocalDate date;
    String type;

    // getters & setters


我正在尝试将其转换为List&lt;Person&gt;Map&lt;String, Map&lt;LocalDate,List&lt;Person&gt;&gt;&gt;,其中外部映射的键是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&lt;Person&gt;,然后再继续创建新列表。这是一个两步过程:

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>>>

如何把list<map> 变成list<string>

求教arraylist里面放map,怎么循环遍历得到map里面的数据,如:List<Map<String, String>> list = new Ar

list<String>如何转化为Map<String, Object>,list<EmpVO>如何转化为Map<String, Object>

List<Map<String, Integer>> 遍历相加