次のように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
実装安定ソート。