2017-10-18 23 views
2

私はかなり洗練された仕事に直面しています(少なくとも私にとって)。 List<E>Eには2つのフィールドABがあるとします。リストに重複がある可能性があります。 EのインスタンスをAフィールドで重複して削除し、そのうちの最も多くのインスタンスをBにする必要があります(これをプリミティブのように比較できます)。
例:
入力:[{1; 1}, {1; 2}, {3; 4}, {3; 3}, {3; 1}, {2; 2}]
出力:私の心に来た[{1; 2}, {3; 4}, {2; 2}]
まず最初はただ、ネストされたループforthisのようなものを使用することです。しかしまず第一に、ループ内のリストのノードを削除するとうまくいくかどうかはわかりません。第2に、内部全体をリストではなく、外側のイテレータからリストの最後まで繰り返すことをお勧めします。この場合、外側のイテレータは「小さい」と内側のイテレータであることがわかるかもしれないので、削除する必要がありますそれはループを傷つけるかどうかは分かりません。
私は一言で言えば、forループで信頼性の高いコードを書くことができますか、どのように実装するか、他のどのようなデザインが好きでしょうか。追加の条件でリストから重複を削除する

答えて

3

ストリームを使用します。いくつかのダミータイプの定義から始めましょう: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

うわー! Javaの6ヶ月後、私はまだストリームを使用しません。幅広い機能を提供しているので、間違いなく深く入ります。 – Russiancold

+0

@Russiancoldはい、ストリームは素晴らしいです!間違いなく学習曲線ですが、投資を後悔することはありません。 – shmosel

1

今日私がリストについて学んだことの1つは、アイテムを削除したい場合はリストを逆向きに繰り返すことです。この方法では、範囲外の例外を避けることができます。 そうでなければ、私はループのためにそれをするだろう、より良いアイデアatmを持っていない。

+0

あなたには、いくつかの実装を提供することができますか?私のために入れ子にしてどのように後方に反復するのかは明らかではありません。これに対してカスタムIteratorを作成する必要がありますか? – Russiancold

関連する問題