gpt4 book ai didi

arraylist - Java8 Streams-比较两个列表的对象值并将值添加到第一个列表的子对象吗?

转载 作者:行者123 更新时间:2023-12-03 07:58:47 29 4
gpt4 key购买 nike

我有两个类:

public class ClassOne {

private String id;
private String name;
private String school;
private String score; //Default score is null

..getters and setters..
}

public class ClassTwo {

private String id;
private String marks;

..getters and setters..
}

而且,我有上述类(class)的两个 list ,
List<ClassOne> listOne;
List<ClassTwo> listTwo;

如果ID相等,如何根据条件比较两个列表并为listOne的得分分配listTwo的分数。我知道,我们可以使用两个for循环来做。但是我想使用Java8流来实现它。
List<ClassOne> result = new ArrayList<>();

for(ClassOne one : listOne) {
for(ClassTwo two : listTwo) {
if(one.getId().equals(two.getId())) {
one.setScore(two.getmarks());
result.add(one);
}
}
}
return result;

如何使用Java8 lambda和流实现此功能?

最佳答案

listOne.size()为N而listTwo.size()为M。
那么2-for-loop解决方案的复杂度为O(M * N)。

我们可以通过用id索引listTwo来将其减少为O(M + N)。

情况1-假设listTwo没有具有相同ID的对象

// pair each id with its marks
Map<String, String> marksIndex = listTwo.stream().collect(Collectors.toMap(ObjectTwo::getId, ObjectTwo::getMarks));
// go through list of `ObjectOne`s and lookup marks in the index
listOne.forEach(o1 -> o1.setScore(marksIndex.get(o1.getId())));

情况2-假设 listTwo具有相同ID的对象
    final Map<String, List<ObjectTwo>> marksIndex = listTwo.stream()
.collect(Collectors.groupingBy(ObjectTwo::getId, Collectors.toList()));

final List<ObjectOne> result = listOne.stream()
.flatMap(o1 -> marksIndex.get(o1.getId()).stream().map(o2 -> {
// make a copy of ObjectOne instance to avoid overwriting scores
ObjectOne copy = copy(o1);
copy.setScore(o2.getMarks());
return copy;
}))
.collect(Collectors.toList());

要实现 copy方法,您要么需要创建一个新对象,然后一个一个地复制字段,但是在这种情况下,我更喜欢遵循 Builder pattern。它还会产生更多的“功能性”代码。

关于arraylist - Java8 Streams-比较两个列表的对象值并将值添加到第一个列表的子对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48836929/

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