猿问

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

我有一个元素列表。我想根据某些条件将此列表的元素分组为一个列表列表。是否可以在 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 来做到这一点?


尚方宝剑之说
浏览 167回答 3
3回答

红颜莎娜

根据您的描述,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()&nbsp; &nbsp; &nbsp; &nbsp; .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()) {&nbsp; &nbsp; System.out.println(entrySet.getKey().toString() + ": " + entrySet.getValue().size());}输出是:[IV, Combined]: 3[II, Domestic]: 1[III, Combined]: 4[IV, Domestic]: 4如果fullList必须具有您描述的顺序,那么您可以使用 aLinkedHashMap并对其进行排序。

慕侠2389804

还不能发表评论,所以添加一个答案,以扩展@Schedu Luca 的回答,'groupingBy' 子句可以链接起来,像这样Map<String,&nbsp;List<Target>>&nbsp;collect&nbsp;=&nbsp;ucrtargetList.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.groupingBy(Target::getRisklevel,&nbsp;Collectors.groupingBy(Target::getLocation)));

米脂

List<List<Target>>&nbsp;fullList&nbsp;=&nbsp;ucrtargetList.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.groupingBy(Target::getRisklevel))&nbsp;//&nbsp;Or&nbsp;another&nbsp;collector &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.entrySet() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(Map.Entry::getValue) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());如果要从结果中删除相同的对象,则需要添加方法 'equals' 和 'hashcode' 并收集到 Set。
随时随地看视频慕课网APP

相关分类

Java
我要回答