Javaのコンパレータを使用して別のリストで並べ替えオブジェクト一覧

simplelenz:

次のようにThareは、2つの入力リストであります:

inputA = [
            {
               name: "A",
               age: 20
            }, 
            {
               name: "B",
               age: 30
            },
            {  name: "C",
               age: 25
            },
            {  name: "D",
               age: 28
            }
          ]

inputB = ["D", "B"]

次のように私の優先出力リストでなければなりません。

expectedOutput = [
            {
               name: "D",
               age: 28
            }, 
            {
               name: "B",
               age: 30
            },
            {  name: "A",
               age: 20
            },
            {  name: "C",
               age: 25
            }
          ]

私がこれまで行ってきたことは以下のようになります。

AtomicInteger count = new AtomicInteger();
Collections.sort(inputA, Comparator
    .comparing(a -> 
    if (inputB.indexOf(a.getName()) > -1) {
        return -1;
    }
    else {
        return count.incrementAndGet();
    })
    .thenComparingInt(a -> a.getAge()));

次のように私は取得していますが出力され

actualOutput = [
            {
               name: "D",
               age: 28
            }, 
            {
               name: "B",
               age: 30
            },
            {  name: "C",
               age: 25
            },
            {  name: "A",
               age: 20
            }
          ]

問題は、リストに自分の名前を持っていない要素ですinputBそこ順序は、元の順序を持っていませんinputA持続する元の順序は、のために{ name: "A", age: 20 }前に来る必要があります{ name: "C", age: 25 }

コンパレータチェーン戦略を使用しながら、どのように私はこの問題を解決することができますか?

UPDATEソートロジックはinputAは名前がINPUTBリストに等しいオブジェクトを持っている場合、それらの要素はinputAの先頭に来るべきとinputA内の他の要素の元の順序を維持しながら、それらの要素は、自分の年齢でソートする必要があり、ありますINPUTBには存在しないました

この質問は、元の順序で残りの要素を残しつつ、二つのリストも最初のリストからオブジェクトのプロパティでソートする共通の要素を比較しようとするので、これは、重複する可能性はありません。

フェデリコ・ペラルタシャフナー:

私はそれを見たよう名前がに含まれている場合、あなたは年齢別の要素をソートする必要があるinputBリストとそれらが含まれていない場合は、そのまま残りの要素を残しinputBリスト。ソートされていないものが一番下に表示されますしながら、年齢によってソートされた要素は、結果の上部に表示されます。

これはあなたが何をする必要があるかである場合は、使用することができComparator.comparingInt、それが(最初のケースの場合)または年齢のいずれかの整数を返すてみましょうInteger.MAX_VALUE(他のケースのために)。

あなたは以上のチェックを最適化する必要がありinputB、それが高速であるように、。このために、あなたが作成することができますHashSetからinputB

これはコードです:

Set<String> set = new HashSet<>(inputB);

Collections.sort(inputA, Comparator.comparingInt(a -> set.contains(a.getName()) ? 
                                                      a.getAge() : 
                                                      Integer.MAX_VALUE));

限り、あなたはに等しい年齢を持っていないので、これは作品Integer.MAX_VALUE

アイデアは、あなたが常に年齢によって比較することであるが、に属し要素はしていない場合inputB、あなたはに年齢を回しますInteger.MAX_VALUEこれには2つの効果があります:最初、それが中に含まれていない要素になりますinputB下部に表示されますが、あなたは常に返すように、第2、 Integer.MAX_VALUEの順inputAリストがあるため、保存されたCollections.sort実装安定ソート

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=165319&siteId=1