在我的程序中,我有一个植物列表,每个植物都有一个度量(字符串),天(整数),相机(整数)和重复编号(整数)。我通过使用过滤器获得了所有想要的植物的清单:
List<Plant> selectPlants = allPlants.stream().filter(plant -> passesFilters(plant, filters)).collect(Collectors.toList());
我现在想做的是获取所有具有相同摄像机,测量值和重复值的植物。并按顺序将它们合并。因此,如果我有第1,2,3,5天,我想查找所有相似的工厂并将值附加到getValues(函数)所在的一处工厂。
我向Plant添加了一个方法,该方法仅使用addAll(new plant values)即可附加值。
有什么方法可以做到,而无需遍历列表反复查找相似的植物,然后每天进行排序,然后追加?我很抱歉这个问题的措辞糟糕。
最佳答案
虽然Vakh’s answer是正确的,但它不必要地复杂。
通常,实现自己的密钥类的工作不会奏效。您可以将List
用作键,这意味着由于对原始值进行装箱会产生少量开销,但是鉴于我们在此处进行哈希运算等操作,因此可以忽略不计。
而且不必使用for
循环(甚至更糟的是Comparator
的匿名内部类)来完成排序。为什么会有流和lambda?您可以使用lambda来实现Comparator
,例如(p1,p2) -> p1.getDay()-p2.getDay()
,甚至更好的是Comparator.comparing(Plant::getDay)
。
此外,您可以一步完成整个操作。 sort
步骤将创建一个有序流,并且收集器将保持遇到顺序,因此您可以使用一个流来进行排序和分组:
Map<List<?>, List<Plant>> groupedPlants = allPlants.stream()
.filter(plant -> passesFilters(plant, filters))
.sorted(Comparator.comparing(Plant::getDay))
.collect(Collectors.groupingBy(p ->
Arrays.asList(p.getMeasurement(), p.getCamera(), p.getReplicateNumber())));
就这样。