List<Object> 到 Map<String, Map<String,List<Object>>>
Posted
技术标签:
【中文标题】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<Object> 到 Map<String, Map<String,List<Object>>>的主要内容,如果未能解决你的问题,请参考以下文章
java 从数据库中返回来的数据list<Map<String ,Object>> 做拼接处理
请教高手:java中 SQL查询结果返回为List<Map<String,Object>>结果集顺序问题
使用点分隔符将 List 转换为 String 到 Map<String, Object>
map怎么转成list<map<string,object>>
list<String>如何转化为Map<String, Object>,list<EmpVO>如何转化为Map<String, Object>
结果集存放在 List<Map<String,Object>>中怎么使用Java代码遍历获取String,Object的值?