在我的程序中,我有一个植物列表,每个植物都有一个度量(字符串),天(整数),相机(整数)和重复编号(整数)。我通过使用过滤器获得了所有想要的植物的清单:

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())));

就这样。

10-04 10:45