gpt4 book ai didi

java - ArrayList中合并对象的高效算法

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:56 26 4
gpt4 key购买 nike

我有一个自定义对象(DTO)的ArrayList,DTO的结构:

private String id;
private String text;
private String query;
private String locatorId;
private Collection<String> categories;
private Collection<String> triggers;

我有两个任务:

  • 去除Array中的重复项(好像可以,我应该用HashSet)
  • 在 ArrayList 中找到具有相同 id 字段的对象并将它们合并为一个对象(我应该合并字段类别和触发器)并创建包含合并对象的最终列表。

完成此类任务最有效的方法是什么?另外,我对在我的算法中使用 Lambda 表达式很感兴趣。

最佳答案

使用流 API 通过指定键合并对象非常容易。首先,在您的 Entity 类中定义一个 merge 方法,如下所示:

public Entity merge(Entity other) {
this.categories.addAll(other.categories);
this.triggers.addAll(other.triggers);
return this;
}

然后你可以构建一个自定义分组收集器:

import static java.util.stream.Collectors.*;

public static Collection<Entity> mergeAll(Collection<Entity> input) {
return input.stream()
.collect(groupingBy(Entity::getId,
collectingAndThen(reducing(Entity::merge), Optional::get)))
.values();
}

在这里,我们根据 getId 方法的结果对 Entity 元素进行分组,当相同的 时,下游收集器仅调用 Entity.merge() >id 遇到(我们需要另外展开Optional)。此解决方案中的Entity 不需要特殊的hashCode()equals() 实现。

请注意,此解决方案会修改现有的未合并 Entity 对象。如果不需要,请在 merge() 方法中创建一个新的 Entity 并返回它(如@Marco13 的回答)。

关于java - ArrayList中合并对象的高效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31783591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com