Kotlin - リストの並べ替え方法(sort、sortBy、sortWith)

鼻間違ったでリストをソートするさまざまな方法を紹介します。

1. Immutable リストのソート

sorted()は、データの変更がないリスト(Immutable list)をソートするときに使用します。 sorted()はリストのソースを変更せずに、ソートされたリストを作成して返します。

以下は、Immutableリストを sorted()でソートする例です。

fun main(args: Array<String>){

    val list = listOf(10, 100, 50, 2, 77, 4)

    val sorted = list.sorted()
    println("sorted: $sorted")
}

Output:

sorted: [2, 4, 10, 50, 77, 100]

2. Mutable リストのソート

sort()は、データの変更が可能なリスト(Mutable list)の要素を並べ替えます。リスト自身が持っている要素の順序を変更します。

次はMutableリストを sort()でソートする例です。

fun main(args: Array<String>){

    val list = mutableListOf(10, 100, 50, 2, 77, 4)

    list.sort()
    println("sorted: $list")
}

Output:

sorted: [2, 4, 10, 50, 77, 100]

3. 逆順に並べ替え(昇順、降順)

Mutable、Immutableリストに沿って逆の順序でソートするメソッドが異なります。

  • reversed():Immutableリストで使用します。逆の順序で変更されたリストを作成して返します
  • reverse():Mutableリストで使用され、リスト自身の要素の順序を逆に変更します

次のようにMutableまたはImmutableリストを逆の順序で並べ替えることができます。

fun main(args: Array<String>){

    // 1. immutable list
    val list = listOf(10, 100, 50, 2, 77, 4)
    val sorted = list.sorted().reversed()
    println("sorted : $sorted")

    // 2. mutable list
    val list2 = mutableListOf(10, 100, 50, 2, 77, 4)
    list2.sort()
    list2.reverse()
    println("sorted : $list2")
}

Output:

sorted : [100, 77, 50, 10, 4, 2]
sorted : [100, 77, 50, 10, 4, 2]

4. sortedWith(), sortWith()

sortWith()は並べ替え規則的なComparatorを変更します。つまり、Comparatorを変更して、自分が好きな方法でリストを並べ替えることができます。

Mutable、Immutableによって使用するメソッドが異なります。

  • sortedWith():Immutable listで使用
  • sortWith():Mutable listで使用

Stringを sorted()でソートすると、基本的に文字列のASCII値を比較して並べ替えます。もし、文字列の長さでソートしたいときにComparatorを直接実装して sortedWith()の引数として渡すことができます。 Comparatorを作成するときは、 compareByのLambdaに比較オブジェクトが返されるように作成されます。

次は、文字列の長さに配置する例を示します。 sorted()sortedWith()でソートされている結果を比較することができます。

fun main(args: Array<String>){

    val list = listOf("apple", "banana", "kiwi", "orange", "watermelon")

    val alphabetOrder = list.sorted()
    println("Alphabet order: $alphabetOrder")

    val comparator : Comparator<String> = compareBy { it.length }
    val lengthOrder = list.sortedWith(comparator)
    println("Length order: $lengthOrder")
}

Output:

Alphabet order: [apple, banana, kiwi, orange, watermelon]
Length order: [kiwi, apple, banana, orange, watermelon]

Example 2: より具体的な Comparator の定義

Comparatorでオブジェクトを比較すると、二つのオブジェクトが同じとき、他の条件で比較したいときがあります。

次の例ではComparatorは、まずyearで比較をして、yearが同じであればmonth、day順に比較します。

import java.util.*

fun main(args: Array<String>){
    val dates = mutableListOf(
        Date(2020, 4, 3),
        Date(2021, 5, 16),
        Date(2020, 4, 29)
    )

    dates.sortWith(compareBy<Date> { it.year }.thenBy { it.month }.thenBy { it.day })

    dates.forEach { println(it) }
}

Output:

Mon May 03 00:00:00 KST 3920
Sat May 29 00:00:00 KST 3920
Thu Jun 16 00:00:00 KST 3921

5. sortedBy(), sortBy()

sortBy()はリストの要素が1つのデータタイプとして行われておらず、内部に複数のオブジェクトを持っているタイプであるとき、いくつかのオブジェクトを比較して並べ替えることか決定するときに使用します。

  • sortedBy():Immutable listで使用
  • sortBy():Mutable listで使用

次の例では listはPairを要素として持っています。 Pairは最初と2番目の要素を持っているが、いくつかの要素をソートするときに使用するか sortBy()で選択することができます。 次のコードで sortBy { it.first }はPairの最初の要素でソートをして、 sortBy { it.second }は、2番目の要素に配置します。

fun main(args: Array<String>){

    val list = mutableListOf("d" to 4, "a" to 10, "c" to 8, "h" to 5)
    println("list: $list")

    list.sortBy { it.first }
    println("sortByFirst: $list")

    list.sortBy { it.second }
    println("sortBySecond: $list")
}

Output:

list: [(d, 4), (a, 10), (c, 8), (h, 5)]
sortByFirst: [(a, 10), (c, 8), (d, 4), (h, 5)]
sortBySecond: [(d, 4), (h, 5), (c, 8), (a, 10)]

References

codechachaCopyright ©2019 codechacha