这个问题似乎很复杂,所以我在这里张贴这个问题的任何可能的方法来解决这个问题。
我有Map列表。我想再次Map列表,但要确保Map转换成某种层次结构。
原始数据:(列表〈Map〈字符串,对象〉〉)
[
{
"studentId": 101,
"name": "John",
"subjectId": 2001,
"marks": 85,
"street": "Bakers Street",
"state": "LA"
},
{
"studentId": 101,
"name": "John",
"subjectId": 2002,
"marks": 75,
"street": "Bakers Street",
"state": "LA"
},
{
"studentId": 102,
"name": "Shae",
"subjectId": 3001,
"marks": 96,
"street": "Howards",
"state": "NYC"
}
]
此Map列表将被转换为下面的Map列表:(列表〈Map〈字符串,对象〉〉)
[
{
"studentId": 101,
"name": "John",
"academics":
[
{
"subjectId": 2001,
"marks": 85
},
{
"subjectId": 2002,
"marks": 75
}
],
"address":
{
"street": "Bakers Street",
"state": "LA"
}
},
{
"studentId": 102,
"name": "Shae",
"academics":
[
{
"subjectId": 3001,
"marks": 96
}
],
"address":
{
"street": "Howards",
"state": "NYC"
}
}
]
作为一个天真的解决方案,我试图手动处理它们(真的很无聊),所以寻找任何有效和干净的方式来做它使用流或任何其他可能的方式。
UPDATE初始解决方案如下
public List<Map<String, Object>> transformResultSet(List<Map<String, Object>> flatDataList) {
List<Map<String, Object>> hierarchicalDataList = new ArrayList<Map<String, Object>>();
Map<String, List<Map<String, Object>>> studentIdToStudentDataListMap = new LinkedHashMap<>();
for (Map<Integer, Object> flatData : flatDataList) {
if (studentIdToStudentDataListMap.get(flatData.get("student_id")) == null) {
studentIdToStudentDataListMap.put(Integer.valueOf(flatData.get("student_id").toString()), new ArrayList<Map<String, Object>>());
}
studentIdToStudentDataListMap.get(Integer.valueOf(flatData.get("student_id").toString())).add(flatData);
}
for (Map.Entry<Integer, List<Map<String, Object>>> studentFlatDataList : studentIdToStudentDataListMap.entrySet()) {
Map<String, Object> studentHierarchicalDataMap = new LinkedHashMap<String, Object>();
Map<String, Object> studentFlatDataMap = studentFlatDataList.getValue().get(0);
studentHierarchicalDataMap.put("studentId", studentFlatDataMap.get("studentId"));
studentHierarchicalDataMap.put("name", studentFlatDataMap.get("name"));
List<Map<String, Object>> academicsList = new ArrayList<Map<String, Object>>();
for (Map<String, Object> studentDetailAcademic : studentFlatDataList.getValue()) {
Map<String, Object> academic = new LinkedHashMap<String, Object>();
academic.put("subjectId", studentDetailAcademic.get("subjectId"));
academic.put("marks", studentDetailAcademic.get("marks"));
academicsList.add(academic);
}
studentHierarchicalDataMap.put("academics", academicsList);
Map<String, Object> address = new LinkedHashMap<String, Object>();
address.put("street", studentFlatDataMap.get("street"));
address.put("state", studentFlatDataMap.get("state"));
studentHierarchicalDataMap.put("address", address);
hierarchicalDataList.add(studentHierarchicalDataMap);
}
return hierarchicalDataList;
}
3条答案
按热度按时间mfuanj7w1#
从你的json样本看,你似乎有
List<Object>
而不是List<Map<String, Object>>
。所以,***只是给予你一个想法***创建两个对象,让我们假设StudentDto
和MarkDto
。假设输入对象是
Student
和具有List<MarkDto>
作为成员的StudentDto
:btxsgosb2#
您可以将算法分成几个步骤:
1.将
subjectId
、marks
提取到一个新的academics
、Map
。1.将
street
、state
提取到一个新的address
、Map
。1.将
academics
Map
用一个List
包裹。1.按
studentId
合并数据,当发生冲突时,我们需要合并academics
List
。步骤
1.
和2.
除了键名外都是一样的,我们可以把它提取到一个新的类中,避免重复的方法引用:由于我们已经实现了第一步和第二步,因此可以在以下示例中使用它:
以上代码打印:
lf3rwulv3#
看起来您需要按学生分组,同时还要更改json结构。
在更高级别上,您可以执行以下操作(我们稍后将看到详细信息):
因此,这将创建一个分层格式的学生Map,按
studentId
分组。我们将委托给两种方法:一个是从扁平学生创建分层学生,另一个是合并具有相同studentId
的两个分层学生。transformToHierarchicalStudent
方法如下所示:而
mergeHierarchicalStudents
方法:这假定在原始平面列表中没有相同学生的重复科目。
最后,如果您需要一个
List
的分层学生,只需抓取map值即可: