2017-10-18 73 views
2

我面临着相当复杂的任务(至少对我而言)。假设我们有List<E>,E有两个字段AB。列表可能有重复。我们需要删除由A字段复制的E的实例,并留下那个具有最多B(假设我们可以将它比作一些原语)的实例。
例子:
输入:[{1; 1}, {1; 2}, {3; 4}, {3; 3}, {3; 1}, {2; 2}]
输出:已经来到我的脑海[{1; 2}, {3; 4}, {2; 2}]
第一件事就是使用嵌套循环for,像this。但首先,我不确定删除循环内的列表节点将工作正常。其次,最好使内部for不是遍历整个列表,而是从外部迭代器到列表的末尾进行迭代,在这种情况下,我们可能会发现外部迭代器是“较小”的,然后是内部迭代器,所以我们需要删除它,并且我不确定它是否会损害循环。
所以我的问题简而言之是:我们能否使用for循环编写可靠的代码,以及如何实现它,或者您更喜欢哪种设计。从附加条件列表中删除重复项

回答

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

哇!在6个月的Java之后,我仍然不使用流。肯定会深入它,因为它提供了如此广泛的功能。 – Russiancold

+0

@Russiancold Yup,流很棒!肯定有一个学习曲线,但你不会后悔投资。 – shmosel

1

今天我学到了一件关于列表的一件事情,就是如果你想删除一个项目,就通过列表向后迭代。这样你可以避免indexofofrange异常。 否则我会用for循环做,不要有更好的主意atm。

+0

你能提供一些实施?这对我来说并不明显,我将如何向后迭代嵌套for。我应该为此创建自定义迭代器吗? – Russiancold