【发布时间】:2019-04-14 18:09:32
【问题描述】:
我有一个如下所示的数据结构。我正在尝试以Map<String, List<String>> 之类的方式对对象进行分组,其中键是 entryId,值是它所属的组列表。 entryId 在组内始终是唯一的。
示例:entryId "1111" 属于 group1,group2,group3。我正在使用旧的 java 7 方法来遍历列表并进行检查。有没有最好的方法使用 Java8 收集器/分组来实现这一点。
List<Group> 其中每个 Group 对象都有一个 Entry 对象列表。
[
{
"id":"group1",
"entries":[
{
"entryId":"1111",
"name":"test1"
},
{
"entryId":"2222",
"name":"test2"
},
{
"entryId":"3333",
"name":"test3"
}
]
},
{
"id":"group2",
"entries":[
{
"entryId":"4444",
"name":"test1"
},
{
"entryId":"1111",
"name":"test2"
},
{
"entryId":"2222",
"name":"test3"
}
]
},
{
"id":"group3",
"entries":[
{
"entryId":"1111",
"name":"test1"
},
{
"entryId":"5555",
"name":"test2"
},
{
"entryId":"3333",
"name":"test3"
}
]
}
]
所以预期的输出是这样的:
[
{
"1111":[
"group1",
"group2",
"group3"
]
},
{
"2222":[
"group1",
"group2"
]
},
{
"3333":[
"group1",
"group3"
]
},
{
"4444":[
"group2"
]
},
{
"5555":[
"group3"
]
}
]
我目前正在使用以下方式。可以按预期工作,但是在 Java 8 中有没有更简单的方法可以实现这一点。
public Map<String, List<String>> mapEntries(List<Group> groups) {
Map<String, List<String>> entryMaps = new HashMap<>();
for (Group group : groups) {
for (Entry entry : group.getEntries()) {
List<String> groupsEntryBelongs = new ArrayList<>();
if (groups.iterator().hasNext() && !entryMaps.keySet().contains(entry.getEntryId())) {
updateGroups(groups, entry.getEntryId(), groupsEntryBelongs, entryMaps);
}
}
}
return entryMaps;
}
void updateGroups(List<Group> groups, String id, List<String> groupsEntryBelongs, Map<String, List<String>> entryMaps) {
for (Group group : groups) {
for (Entry entry : group.getEntries()) {
if (entry.getEntryId().equalsIgnoreCase(id)) {
groupsEntryBelongs.add(group.getId());
}
}
}
entryMaps.put(id, groupsEntryBelongs);
}
【问题讨论】:
-
我使用这种方式遍历组并获取第一个条目 id,然后检查剩余的组以更新我创建的对象 Map
>。我得到了我需要的结果,但要求在 java8 中实现它的建议。 -
始终值得分享您在问题中所做的尝试,以明确您的预期输出。
-
@uli 不,这不是我要找的。我用预期的输出和我目前的做法更新了我的问题。你指的那个不一样。我正在尝试按内部列表中的值进行分组。
标签: java java-8 java-stream grouping