Kotlinで複数のフィールドを基準にコレクションをソートする方法
コレクション(Collection)とは、開発者がさまざまな種類の関連オブジェクトを一箇所にまとめて管理できるオブジェクトです。Kotlinの標準ライブラリには、ListやArrayなど、複数の種類のコレクションが用意されています。
本記事では、コレクション内に存在する複数のプロパティを組み合わせてコレクションをソートする方法を解説します。そのために、Kotlinライブラリが提供する以下の2つの関数を活用します。
sortedWith()
compareBy()
sortedWith()とは
sortedWith()は、指定されたコンパレータ(Comparator)に従ってすべての要素を並べ替えたリストを返す関数です。公式のKotlinドキュメントによると、関数の定義は次のとおりです。
fun <T> Array<out T>.sortedWith( comparator: Comparator<in T> ): List<T>
sortedWith()は引数としてコンパレータを受け取り、各オブジェクトのカスタムプロパティ同士を比較してソートを行います。
compareBy()とは
compareBy()は、sortedWith()に渡すためのコンパレータを生成する役割を担う関数です。このコンパレータを使うことで、オブジェクトのプロパティに基づいたソートが可能になります。Kotlinドキュメントによると、関数の定義は以下のようになっています。
fun <T> compareBy( vararg selectors: (T) -> Comparable<*>? ): Comparator<T>
compareBy()には複数のセレクタ(プロパティ参照)を渡せる点がポイントです。先頭のセレクタが優先的に比較され、値が等しい場合に次のセレクタで比較されるという仕組みになっています。これにより、「年齢が同じならGPAで順位を決める」といった多段階のソートが簡単に実現できます。
実装例
次の例では、学生名・年齢・GPAといった異なる種類の値を保持するStudentクラスを作成します。「年齢」や「GPA」のどちらか一方だけでなく、両方を組み合わせてリスト全体をソートすることを目指します。
fun main()
{
val studentA=Student("Student A",18,7.0)
val studentB=Student("Student B",18,6.9)
val studentC=Student("Student C",20,7.3)
val studentD=Student("Student D",22,8.3)
val studentsList=listOf(
studentA,
studentB,
studentC,
studentD
);
val sortedList=studentsList.sortedWith(
compareBy(
{it.age},
{it.GPA}
)
)
sortedList.forEach {
println("name: ${it.name}, age: ${it.age}, GPA: ${it.GPA}")
}
}
class Student(val name:String, val age:Int, val GPA: Double)
実行結果
上記のコードを実行すると、以下の出力が生成されます。
name: Student B, age: 18, GPA: 6.9 name: Student A, age: 18, GPA: 7.0 name: Student C, age: 20, GPA: 7.3 name: Student D, age: 22, GPA: 8.3
解説
出力結果を見ると、まず年齢(age)の昇順でソートされ、年齢が同じ学生(18歳のStudent AとStudent B)については、GPAの昇順で並べ替えられていることがわかります。このようにsortedWith()とcompareBy()を組み合わせることで、複数のフィールドを優先度付きで扱う柔軟なソート処理を簡潔に記述できます。
なお、降順でソートしたい場合はcompareByDescending()を使用するか、各セレクタに対してreversed()を適用することで対応可能です。状況に応じて使い分けることで、より実用的なデータ操作が実現できます。
-
PHPでarray_multisortを使って多次元配列を複数キーでソートする方法
PHPでは、array_multisort関数を使用することで、多次元配列を複数のキー(カラム)に基づいて並べ替えることができます。この関数は、複数の配列や多次元配列を一度にソートできる強力な機能を提供します。 基本的な使い方 以下の例では、event_typeを降順に、同じ値の場合はtitleを昇順にソートしています。 $v) { $sort[title][$k] = $v[title]; $sort[event_type][$k] = $v[event_type]; } # event_typeは降順(SORT_DESC)、titleは昇順(SORT_ASC)でソートしま
-
PythonでCSVファイルを複数の列(カラム)でソートする方法【pandasのsort_values徹底解説】
はじめにデータ分析の現場では、CSVファイルを読み込んで特定の条件で並べ替えたい場面がよくあります。本記事では、Pythonのpandasライブラリを使って、CSVファイルを複数の列(カラム)でソートする方法をわかりやすく解説します。sort_values()メソッドとはCSVを複数の列でソートするには、pandasのsort_values()メソッドを使用します。複数列でのソートとは、1つ目の指定列に同じ値が重複している場合、その行同士の並び順は2番目に指定した列の値によって決まるという仕組みです。手順1:CSVファイルを読み込むまず、入力用のCSVファイル「SalesRecords.csv