鼻間違ったでリストをソートするさまざまな方法を紹介します。
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
Related Posts
- Kotlin - エルビス演算子(Elvis Operation)
- Kotlin - Timer、定期的に関数を実行する
- Kotlinで正規表現を使用する
- Kotlin - 文字列の比較方法(equals、==、compareTo)
- Kotlin - 2つのList一つの併合
- Kotlin - ディレクトリのすべてのファイルのリスト出力
- Kotlin - リストの並べ替え方法(sort、sortBy、sortWith)
- Kotlin - 乱数生成(Random、SecureRandom)
- Kotlin - StringをFloatに変換
- Kotlin - Destructuring Declaration
- Kotlin - objectとclassキーワードの違い
- Kotlin - 現在の日付と時刻を取得する方法