为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 8 中使用特定标准对列表进行分组

如何在 Java 8 中使用特定标准对列表进行分组

拉风的咖菲猫 2022-01-12 17:13:17
我有一个如下所示的数据结构。我正在尝试以这样的方式对对象进行分组,例如Map<String, List<String>>key 是 entryId 而 value 是它所属的组列表。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"      ]   }]
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

你可以这样做:


Map<String, Set<String>> entryMaps = new LinkedHashMap<>();

groups.forEach(group -> 

    group.getEntries().forEach(entry -> 

            entryMaps.computeIfAbsent(

                    entry.getEntryId().toLowerCase(),

                    k -> new LinkedHashSet<>())

                .add(group.getId())));

这会迭代组,然后是每个组的条目Map.computeIfAbsent,LinkedHashSet如果键不存在,则使用新的空条目放置条目,返回此空集或匹配该键的集。然后,组 id 被添加到这个返回的集合中。


注意:我使用 aSet而不是Listfor 值,以避免可能的重复。而LinkedHashMap和LinkedhashSet保证插入顺序。


查看完整回答
反对 回复 2022-01-12
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

像这样的东西应该可以工作,它需要制作某种中间元组对象:


list.stream()

.flatMap(group ->

   group.getEntries.stream()

        .map(entry -> new GroupEntry(group.getId(), entry.getEntryId()))

)

.collect(

   Collectors.groupingBy(GroupEntry::getEntryId, Collectors.mapping(GroupEntry::getGroupId, Collectors.toList())));



查看完整回答
反对 回复 2022-01-12
  • 2 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信