Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用附加条件从列表中删除重复项_Java_List_Loops_Iterator - Fatal编程技术网

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

Java 使用附加条件从列表中删除重复项,java,list,loops,iterator,Java,List,Loops,Iterator,我面临着相当复杂的任务(至少对我来说)。假设我们有List,E有两个字段A和B。列表可能有重复项。我们需要删除被A字段复制的E的实例,并留下B最多的实例(假设我们可以像一些原语一样对其进行比较)。 示例: 输入:[{1;1},{1;2},{3;4},{3;3},{3;1},{2;2}] 输出:[{1;2},{3;4},{2;2}] 我想到的第一件事就是对循环使用嵌套的,比如。但首先,我不确定删除循环中列表的节点是否可以正常工作。其次,最好不要让内部的for遍历整个列表,而是从外部迭代器遍历到列表

我面临着相当复杂的任务(至少对我来说)。假设我们有
List
E
有两个字段
A
B
。列表可能有重复项。我们需要删除被
A
字段复制的
E
的实例,并留下
B
最多的实例(假设我们可以像一些原语一样对其进行比较)。
示例:
输入:
[{1;1},{1;2},{3;4},{3;3},{3;1},{2;2}]

输出:
[{1;2},{3;4},{2;2}]

我想到的第一件事就是对循环使用嵌套的
,比如。但首先,我不确定删除循环中列表的节点是否可以正常工作。其次,最好不要让内部的
for
遍历整个列表,而是从外部迭代器遍历到列表的末尾,在这种情况下,我们可能会发现外部迭代器比内部迭代器“小”,所以我们需要删除它,我也不确定它是否会破坏循环。

简而言之,我的问题是:我们是否能够使用
for
循环编写可靠的代码,您将如何实现它,或者您更喜欢什么其他设计。

我今天学到的关于列表的一件事是,如果要删除某个项,请向后迭代列表。这样可以避免IndexOutfrange异常。
否则我会用for循环,没有更好的主意了

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

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

interface A {}

interface B extends Comparable<B> {}

你能提供一些实现吗?对于我来说,如何使用嵌套的for向后迭代并不明显。我应该为此创建自定义迭代器吗?哇!使用java 6个月后,我仍然不使用streams。肯定会深入研究它,因为它提供了如此广泛的功能。@Russiancold是的,流是伟大的!肯定有一个学习曲线,但你不会后悔投资。
Collection<E> maxB = list.stream()
        .collect(Collectors.groupingBy(E::getA,
                Collectors.collectingAndThen(
                        Collectors.maxBy(Comparator.comparing(E::getB)),
                        Optional::get)))
        .values();