gpt4 book ai didi

java - 按特定逻辑合并 ArrayList of Integers

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:54 24 4
gpt4 key购买 nike

我的 ArrayList 包含我的简单模型类 User 的许多实例,其中仅包含 2 个字段:

@Data
public class User {
private String email;
private ArrayList<Integer> lists;
}

我正在列表 字段中插入整数值,总是10。有许多 User 类的对象,其中一些对象是重复的,因为它们具有相同的电子邮件 地址但不同的列表

我需要将 Users 的副本合并到 User 的一个对象中,同时还要处理 lists 字段。

User user1 = new User('email@gmail.com', Arrays.asList(0, 1, 0, 1, 1)); 
User user2 = new User('email@gmail.com', Arrays.asList(0, 0, 0, 1, 1));
User user3 = new User('email@gmail.com', Arrays.asList(1, 1, 1, 1, 1));
/* merge duplicated objects into one */
User mergedUser = new User('email@gmail.com', Arrays.asList(1, 1, 1, 1, 1));

我在实现将多个列表 合并为一个的逻辑时遇到困难。其背后的逻辑并不复杂:只要有1,就将1放入合并列表中。许多列表包含 0 而只有一个 1,导致最终合并列表中的值 1

我应该采用什么方法来实现这个合并列表的逻辑?

最佳答案

从 JDK8 开始,您可以使用 toMap 方法来完成您的任务。

Collection<User> result = 
list.stream()
.collect(toMap(User::getEmail,
Function.identity(),
(l, r) -> {
List<Integer> firstList = l.getList();
List<Integer> secondList = r.getList();
IntStream.range(0, firstList.size())
.forEach(i -> firstList.set(i, Math.max(firstList.get(i), secondList.get(i))));
return l;
})).values();

您可以通过将合并逻辑提取到辅助方法中来进一步提高可读性:

private static User apply(User l, User r) {
List<Integer> firstList = l.getList();
List<Integer> secondList = r.getList();
IntStream.range(0, firstList.size())
.forEach(i -> firstList.set(i, Math.max(firstList.get(i), secondList.get(i))));
return l;
}

然后你可以这样做:

Collection<User> result = list.stream()
.collect(toMap(User::getEmail, Function.identity(), Main::apply))
.values();

其中 Main 指的是包含 apply 方法的类。


注意这里重要的是合并函数 ((l, r) -> { ...), see this answer这稍微解释了合并功能。

您可能需要查看 my other posts使用 toMap 收集器来熟悉它和 ofcourse the API doc .

关于java - 按特定逻辑合并 ArrayList of Integers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53613253/

24 4 0