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

java中列表列表中的列表元素分组

java中列表列表中的列表元素分组

尚方宝剑之说 2021-12-01 15:57:49
我有一个元素列表。我想根据某些条件将此列表的元素分组为一个列表列表。是否可以在 java 中轻松完成?public class CollectionTest {    public static void main(String[] arg) {        Target target0 = new Target();        target0.setRisklevel("III");        target0.setLocation("Combined");        Target target1 = new Target();        target1.setRisklevel("III");        target1.setLocation("Combined");        Target target2 = new Target();        target2.setRisklevel("III");        target2.setLocation("Combined");        Target target3 = new Target();        target3.setRisklevel("III");        target3.setLocation("Combined");        Target target4 = new Target();        target4.setRisklevel("IV");        target4.setLocation("Combined");        Target target5 = new Target();        target5.setRisklevel("IV");        target5.setLocation("Combined");        Target target6 = new Target();        target6.setRisklevel("IV");        target6.setLocation("Combined");        Target target7 = new Target();        target7.setRisklevel("II");        target7.setLocation("Domestic");        Target target8 = new Target();        target8.setRisklevel("IV");        target8.setLocation("Domestic");        Target target9 = new Target();        target9.setRisklevel("IV");        target9.setLocation("Domestic");        Target target10 = new Target();        target10.setRisklevel("IV");        target10.setLocation("Domestic");        Target target11 = new Target();        target11.setRisklevel("IV");        target11.setLocation("Domestic");    }}这里的条件是 RiskLevel 和 Location 在 List 列表中的每个列表中必须相同。所以 fullList 应该有 4 个列表(第 1 个 III 和组合,第 2 个 IV 和组合,第 3 个 II 和国内,第 4 个 IV 和国内)。我可以遍历列表并设置值。有没有更简单的方法来使用 java8 或 apache commons 来做到这一点?
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

根据您的描述,fullList 中应该有 4 个列表(第 1 个 III 和组合、第 2 个 IV 和组合、第 3 个 II 和国内、第 4 个 IV 和国内)我假设您正在寻找这个:


Function<Target, List<String>> riskLevelAndLocation = t -> List.of(t.getRiskLevel(), t.getLocation());

Map<List<String>, List<Target>> fullList = ucrtargetList.stream()

        .collect(Collectors.groupingBy(riskLevelAndLocation));

riskLevelAndLocation是 a Function,它返回一个List包含riskLeveland location。groupingBy一个List作品因为List.equals(Object o)


返回true当且仅当该指定的对象也是一个列表,两个列表具有相同的大小,并且在两个列表元素的所有相应的对是相等。


快速检查:


for (Entry<List<String>, List<Target>> entrySet : fullList.entrySet()) {

    System.out.println(entrySet.getKey().toString() + ": " + entrySet.getValue().size());

}

输出是:


[IV, Combined]: 3

[II, Domestic]: 1

[III, Combined]: 4

[IV, Domestic]: 4

如果fullList必须具有您描述的顺序,那么您可以使用 aLinkedHashMap并对其进行排序。


查看完整回答
反对 回复 2021-12-01
?
慕侠2389804

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

还不能发表评论,所以添加一个答案,以扩展@Schedu Luca 的回答,'groupingBy' 子句可以链接起来,像这样

Map<String, List<Target>> collect = ucrtargetList.stream()
           .collect(Collectors.groupingBy(Target::getRisklevel, Collectors.groupingBy(Target::getLocation)));



查看完整回答
反对 回复 2021-12-01
?
米脂

TA贡献1836条经验 获得超3个赞

List<List<Target>> fullList = ucrtargetList.stream()
                .collect(Collectors.groupingBy(Target::getRisklevel)) // Or another collector
                .entrySet()
                .stream()
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());

如果要从结果中删除相同的对象,则需要添加方法 'equals' 和 'hashcode' 并收集到 Set。


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 166 浏览

添加回答

举报

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