从附加条件中删除列表中的重复项

时间:2017-10-18 01:04:29

标签: 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循环的可靠代码,您将如何实现它,或者您更喜欢其他设计。

2 个答案:

答案 0 :(得分:3)

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

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();

答案 1 :(得分:1)

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