JAVA 8以上の回答(ラムダ式の使用)
Java 8では、これをさらに簡単にするためにLambda式が導入されました。すべての足場を持つComparator()オブジェクトを作成する代わりに、次のように簡略化できます(オブジェクトを例として使用)。
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
またはさらに短い:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
この1つのステートメントは次と同等です。
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Lambda式は、コードの関連部分(メソッドシグネチャと返されるもの)を配置するだけでよいと考えてください。
あなたの質問の別の部分は、複数のフィールドと比較する方法でした。Lambda式でこれを行うには、.thenComparing()
関数を使用して2つの比較を1つに効果的に組み合わせることができます。
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
上記のコードは、リストを最初にでソートし、timeStarted
次にtimeEnded
(同じレコードを持つレコードについて)timeStarted
)。
最後に、「長い」または「int」のプリミティブを比較するのは簡単です。一方から他方を差し引くだけです。オブジェクト(「Long」または「String」)を比較する場合は、組み込みの比較を使用することをお勧めします。例:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
編集:.thenComparing()
機能するように指示してくれたLukas Ederに感謝します。