我面临着相当复杂的任务(至少对我来说)。假设我们有 List<E>
, E
有两个字段 A
和B
。列表可能有重复项。我们需要删除 E
的实例其重复项为 A
字段并留下最多的那个 B
(假设我们可以像一些原语一样比较它)。
示例:
输入: [{1; 1}, {1; 2}, {3; 4}, {3; 3}, {3; 1}, {2; 2}]
输出: [{1; 2}, {3; 4}, {2; 2}]
我想到的第一件事就是使用嵌套 for
循环,类似于 this 。但首先我不确定删除循环内列表的节点是否可以正常工作。其次,最好制作内部for
不是遍历整个列表,而是从外部迭代器迭代到列表末尾,在这种情况下,我们可能会发现外部迭代器比内部迭代器“小”,所以我们需要删除它,并且我再次不确定它是否会损害循环。
所以我的问题简而言之是:我们是否能够使用 for
编写可靠的代码循环以及您将如何实现它,或者您喜欢什么其他设计。
最佳答案
我会使用流。让我们从一些虚拟类型定义开始:
interface E {
A getA();
B getB();
}
interface A {}
interface B extends Comparable<B> {}
现在假设您有一些 List<E> list
。您可以流式传输和收集最大 B
的元素。 ,按 A
分组,然后获取 map 的值:
Collection<E> maxB = list.stream()
.collect(Collectors.groupingBy(E::getA,
Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparing(E::getB)),
Optional::get)))
.values();
关于java - 使用附加条件从列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801328/