繁体   English   中英

从列表中删除重复项,并附带其他条件

[英]Removing duplicates from list with additional condition

我面临着相当复杂的任务(至少对我而言)。 假设我们有List<E>E有两个字段AB 列表可能有重复。 我们需要删除由A字段重复的E实例,并保留具有最多B那个实例(假设我们可以像一些原始图元那样比较它)。
例:
输入: [{1; 1}, {1; 2}, {3; 4}, {3; 3}, {3; 1}, {2; 2}] [{1; 1}, {1; 2}, {3; 4}, {3; 3}, {3; 1}, {2; 2}]
输出: [{1; 2}, {3; 4}, {2; 2}] [{1; 2}, {3; 4}, {2; 2}]
我想到的第一件事就是使用嵌套的for循环,就像这样 但是首先我不确定在循环内删除list的节点是否可以正常工作。 其次,这将是更好地使内部for不通过整个名单迭代,但是从外迭代器列表的末尾,在这种情况下,我们可能会发现,外迭代器是“小”,那么内部的那个,所以我们需要删除它,再次我不确定是否会损害循环。
简而言之,我的问题是:我们是否能够使用for循环编写可靠的代码,以及您将如何实现它,或者您希望使用哪种其他设计。

我会使用流。 让我们从一些虚拟类型定义开始:

interface E {
    A getA();
    B getB();
}

interface A {}

interface B extends Comparable<B> {}

现在,假设您有一些List<E> list 您可以流式传输和收集最大B元素,按A分组,然后仅获取地图的值:

Collection<E> maxB = list.stream()
        .collect(Collectors.groupingBy(E::getA,
                Collectors.collectingAndThen(
                        Collectors.maxBy(Comparator.comparing(E::getB)),
                        Optional::get)))
        .values();

我今天学到的关于列表的一件事是,如果要删除某项,则向后遍历列表。 这样可以避免indexoutofrange异常。 否则我会用for循环来做,没有更好的主意atm。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM