java - 使用附加条件从列表中删除重复项

标签 java list loops iterator

我面临着相当复杂的任务(至少对我来说)。假设我们有 List<E> , E有两个字段 AB 。列表可能有重复项。我们需要删除 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/

相关文章:

java - 我正在尝试将数据输入到 parse.com 中的 custommom 列,但出现错误

java - 使用 ScrollView 实现 BottomNavigationView

javascript - 在列表中的特定点插入新的 html 元素

java - 再次解析List<Map<String,String>> String形式为POJO

java - 图像文件的加密与解密

c# - 排序列表或二叉搜索树

vba - 如何循环这段代码直到到达 x 行?

javascript - 如何在javascript中显示图像数组中的上一张图像

c++ - 难以理解 for 循环如何与 C++ 中的数组交互 [作业]

java - 存储接口(interface)实现和检索特定实现的良好模式是什么?