我有一个元素列表。我想根据某些条件将此列表的元素分组为列表列表。有可能在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来做到这一点?
答案 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
,它重新运行包含Function
和List
的{{1}}。 riskLevel
和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
对其进行排序。
答案 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中。