gpt4 book ai didi

java - 根据另一个列表中的属性从列表中提取不常见的元素

转载 作者:行者123 更新时间:2023-12-02 09:45:16 25 4
gpt4 key购买 nike

我的结构

   A {
String id;
String bid;
}

B {
String id;
}

给定

List<A> aList = Arrays.asList(
new A (1,2),
new A (2,5),
new A (3,9),
new A (4,10),
new A (5, 20),
new A (6, 8),
new A (7, 90)
new A (8, 1)
);

List<B> bList = Arrays.asList(
new B (2),
new B (9),
new B (10)
);

现在我希望 A 中与任何 B 的元素都不匹配的元素应该收集在另一个集合中,并且这些元素应该从 A 集合本身中删除。

结果

 List<A> aList = Arrays.asList(
new A (1,2),
new A (3,9),
new A (4,10)
);

List<A> aListBin = Arrays.asList(
new A (2,5),
new A (5, 20),
new A (6, 8),
new A (7, 90)
new A (8, 1)
);

我的看法

我可以考虑使用迭代器迭代 A,并为 A 中的每个元素迭代 B,如果找到,则继续添加到单独的列表并使用迭代器删除删除。

是否有更好的方法使用流魔法来做到这一点?谢谢

最佳答案

Collectors#partitionBy是你的 friend 。

首先,我们将提取 id来自 B 列表变成裸露的Set<Integer> ,所以我们可以用它来查找:

Set<Integer> bSet = bList.stream()
.map(b -> b.id)
.collect(Collectors.toSet());

正如 JB Nizet 所提到的,a HashSet适合这份工作。

那么就这么简单 – 我们将按给定的谓词进行分区。谓词是是否 A.bid包含在任何 B.id 中(为了方便起见,我们将其存储到 bSet 中)。

Map<Boolean, List<A>> map = aList.stream()
.collect(Collectors.partitioningBy(a -> bSet.contains(a.bid)));

现在map.get(true)包含 B 中包含的所有项目, map.get(false)所有其他人。

为了替换aList ,只需重新分配 aList :

aList = map.get(true);

关于java - 根据另一个列表中的属性从列表中提取不常见的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56710688/

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