2017-10-18 68 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