在Java中的列表列表中对列表元素进行分组

时间:2018-10-22 08:47:50

标签: java list arraylist collections

我有一个元素列表。我想根据某些条件将此列表的元素分组为列表列表。有可能在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");

        List<Target> ucrtargetList = new ArrayList<Target>();
        ucrtargetList.add(target0);
        ucrtargetList.add(target1);
        ucrtargetList.add(target2);
        ucrtargetList.add(target3);
        ucrtargetList.add(target4);
        ucrtargetList.add(target5);
        ucrtargetList.add(target6);
        ucrtargetList.add(target7);
        ucrtargetList.add(target8);
        ucrtargetList.add(target9);
        ucrtargetList.add(target10);
        ucrtargetList.add(target11);
        List<List<Target>> fullList = new ArrayList<List<Target>>();
    }
}

这里的条件是RiskLevel,并且List列表中的每个列表中的Location必须相同。因此,fullList中应包含4个列表(第一三和合并,第二和四合并,第三和家庭第二,第四和家庭第四)。

我可以遍历列表并设置值。有没有更简单的方法可以使用java8或apache commons来做到这一点?

3 个答案:

答案 0 :(得分:1)

尚无法发表评论,因此添加一个答案以扩展@Schidu Luca的答复,像这样可以链接'groupingBy'子句

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

答案 1 :(得分:1)

根据您的描述, fullList中应包含4个列表(第一三级和合并,第二四级和合并,第三第二级和国内,第四四级和国内)我认为您正在寻找以下内容:< / p>

[1,1,0]

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,它重新运行包含FunctionList的{​​{1}}。 riskLevellocation之所以有效,是因为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 对其进行排序。

答案 2 :(得分:0)

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中。