gpt4 book ai didi

java - 使用 Java 8 在列表中查找匹配项以创建新列表

转载 作者:行者123 更新时间:2023-12-01 19:32:08 25 4
gpt4 key购买 nike

我有一个包含对象的列表,即狗。狗可以是雄性雌性。这是对象内的一个变量。

我需要迭代 Dogs,对于每只公狗,我需要查看是否有一只母狗与公狗的两个变量相匹配。

Dog.getName()Dog.getAge()。所以我会有一个男性和女性匹配他们的名字和年龄。

如果我找到匹配项,我需要将两只狗添加到新列表中。

我一直在想如何使用 Java 8 来实现这一点,并且真的需要一些建议。

我已经完成了一些代码,但想知道是否可以使其更高效。

到目前为止我必须做的事情:

List<Dog> dogsA = unmatchedDogs
.stream()
.filter(
dogA ->{
return dogA.getGender().equalsIgnoreCase("Male");
}
)
.collect(Collectors.toList());

List<Dog> dogsB = unmatchedDogs
.stream()
.filter(
dogB ->{
return dogB.getGender().equalsIgnoreCase("Female");
}
)
.collect(Collectors.toList());

List<Dog> dogsToUpdate = new ArrayList<>();

dogsA.stream()
.flatMap(x -> dogsB
.stream()
.filter(y -> x.getAge().equalsIgnoreCase(y.getAge()))
.filter(y -> x.getName().equalsIgnoreCase(y.getName()))
.limit(1))
.forEach(product -> dogsToUpdate.add(product));

dogsB.stream()
.flatMap(x -> dogsA
.stream()
.filter(y -> x.getAge().equalsIgnoreCase(y.getAge()))
.filter(y -> x.getName().equalsIgnoreCase(y.getName()))
.limit(1))
.forEach(product -> dogsToUpdate.add(product));

最佳答案

讽刺的是,使用循环方法它会更可读并且更短,而且它仍然是 O(n^2)。 :

for (int i = 0; i < dogsA.size(); i++) {
for (int j = 0; j < dogsB.size(); j++) {
Dog male = dogsA.get(i);
Dog female = dogsB.get(j);

if (male.getAge() == female.getAge()
&& male.getName().equals(female.getName())) {
dogsToUpdate.add(male);
dogsToUpdate.add(female);
}
}
}

附注Stream API 应尽可能使用,但是,如果它使逻辑看起来更复杂并且不能提供额外的效率,您应该考虑简单的方法。如果您不想使用循环,请告诉我,我将编辑我的答案并尝试提出流 API 解决方案。

关于java - 使用 Java 8 在列表中查找匹配项以创建新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59373067/

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