Kotlinのsorted・sortedByでコレクションをソートする方法【初心者向け完全ガイド】
生徒
「Kotlinでリストの要素を順番に並べ替えるにはどうしたらいいですか?」
先生
「KotlinにはsortedとsortedByという便利な関数があります。数字や文字列を昇順や特定の条件で並び替えることができますよ。」
生徒
「sortedとsortedByって、どう違うんですか?」
先生
「sortedは自然な順序で並べ替え、sortedByは指定した条件(キー)に基づいて並べ替えます。では、例を交えて説明しますね。」
1. sortedとは?
sortedは、リストの要素を自然な順序で並べ替えるための関数です。自然な順序とは、数字であれば小さい順、文字列であれば辞書順(あいうえお・ABC順)を指します。
ポイントは、元のリストは変更されず、新しい並び替え済みのリストが返ってくる点です。安全にデータを扱えるため、初心者でも安心して使えます。
まずは、数字のリストを小さい順に並べ替える基本的な例を見てみましょう。
fun main() {
val numbers = listOf(5, 2, 8, 1, 3)
val sortedNumbers = numbers.sorted()
println(sortedNumbers)
}
[1, 2, 3, 5, 8]
この例では、sorted()を呼び出すだけで、数字が自動的に小さい順へ並び替えられています。for文などで比較処理を書く必要はありません。
なお、文字列のリストに使った場合も同様で、アルファベットやひらがなの順番に従って並び替えられます。sortedは「シンプルに順番を整えたいとき」に最初に覚えておきたい関数です。
2. sortedByとは?
sortedByは、リストの要素そのものではなく、要素の中にある値(プロパティ)や計算結果を基準に並べ替えたいときに使う関数です。
sortedが「そのままの値」で順番を決めるのに対し、sortedByは「どの値を基準にするか」を自分で指定できるのが大きな特徴です。
たとえば、文字列を長さの短い順に並べたい場合は、次のように書きます。
fun main() {
val words = listOf("apple", "banana", "kiwi", "grape")
val sortedByLength = words.sortedBy { it.length }
println(sortedByLength)
}
[kiwi, apple, grape, banana]
{ it.length }の部分が「並び替えの基準」です。ここでは「文字数」を表しており、短い単語から順番に並んでいます。
このようにsortedByを使えば、「長さ」「価格」「年齢」など、さまざまな条件を基準に並べ替えができるため、実務でもよく使われる便利な関数です。
3. 降順で並べ替える(sortedDescending / sortedByDescending)
並べ替えは「小さい順」だけでなく、大きい順(降順)にしたい場面もよくあります。たとえば、点数の高い順にランキングを作ったり、長い単語を先に表示したりするケースです。
そんなときは、数字ならsortedDescending、条件を指定したいならsortedByDescendingを使います。どちらも元のリストはそのままで、並び替えた新しいリストが返ってくるので安心です。
fun main() {
val numbers = listOf(5, 2, 8, 1, 3)
val descNumbers = numbers.sortedDescending()
println(descNumbers)
val words = listOf("apple", "banana", "kiwi", "grape")
val descByLength = words.sortedByDescending { it.length }
println(descByLength)
}
[8, 5, 3, 2, 1]
[banana, apple, grape, kiwi]
最初のsortedDescending()は、数字を「大きい → 小さい」の順に並べ替えています。次のsortedByDescending { it.length }は、it.length(文字数)を基準にして、長い単語から順番に並べています。
初心者向け:覚え方のコツ
Descendingは「下り=大きい方から下がっていく」と覚えると分かりやすいです。まずは「降順にしたいなら末尾にDescending」と覚えておくと迷いません。
4. データクラスとsortedBy
データクラスの特定のフィールドで並べ替えることも簡単です。例えば、生徒を年齢順に並べ替える場合です。
data class Student(val name: String, val age: Int)
fun main() {
val students = listOf(
Student("山田", 20),
Student("佐藤", 18),
Student("鈴木", 22)
)
val sortedByAge = students.sortedBy { it.age }
println(sortedByAge)
}
[Student(name=佐藤, age=18), Student(name=山田, age=20), Student(name=鈴木, age=22)]
このように、オブジェクトのプロパティを使って並べ替えができます。
5. 実用例:商品の価格順に並べ替え
ネットショップの商品リストを価格の安い順に並べる例です。
data class Product(val name: String, val price: Int)
fun main() {
val products = listOf(
Product("ノートパソコン", 120000),
Product("マウス", 2000),
Product("キーボード", 5000)
)
val sortedByPrice = products.sortedBy { it.price }
println(sortedByPrice)
}
[Product(name=マウス, price=2000), Product(name=キーボード, price=5000), Product(name=ノートパソコン, price=120000)]
安い順・高い順で並べ替えることで、ユーザーが商品を探しやすくなります。
6. sortedとsortedByの使い分け
sorted():要素自体が比較可能(数値や文字列)で、その自然順序で並べ替えるsortedBy { ... }:特定の条件やプロパティに基づいて並べ替える- 降順の場合は
sortedDescending()やsortedByDescending()を使う
このように、用途によって関数を選べば効率的にデータを並べ替えられます。
まとめ
Kotlinでリストやコレクションの要素を並べ替えるときに使うsortedやsortedByという関数は、初めて学ぶ段階では違いが分かりにくいものですが、実際にはとても直感的で扱いやすい機能です。自然な順番で並べ替えるsorted、条件を指定して並び替えるsortedBy、さらに降順にしたいときのsortedDescendingやsortedByDescendingなど、場面に応じて柔軟に使い分けることができます。並べ替えを正しく使えるようになると、日常的なデータ処理からアプリケーションでの一覧表示、検索機能の最適化など、幅広い場面で役立ちます。
並べ替えという操作は単に順番を変えるだけの作業に思えますが、実際はデータを扱う上で非常に重要な工程であり、情報をどのように見せるか、どのように扱うかという点に大きく関わります。例えば、商品一覧の価格順表示、生徒名簿の年齢順ソート、コメントを投稿日時で並び替えるといった処理は、すべてsortedやsortedByで実現できます。こうした日常的な例を考えると、実務でも活用できる技術であることがよく分かります。
また、sortedやsortedByはイミュータブルなコレクションに対して使用しても新しいリストを生成するため、元のデータが変更されることはありません。この性質により、データを安全に扱いながら複数の構成を比較することができ、学習段階でも安心して使える仕組みになっています。さらにデータクラスを利用してプロパティをキーに並べ替える方法は、実用的な場面にも直結するため、覚えておくととても便利です。
実務でも学習でも、複雑なデータを処理する場合は「どの基準で並べるか」が常に問われます。sortedByを使えば、文字列の長さを基準にしたり、計算した結果を基準にしたり、オブジェクトの特定の要素を参照したりと、柔軟に並べ替え条件を設計できます。これはデータの見せ方を工夫したいときや、ユーザーが使いやすい並び順を設定したいときにとても役立ちます。
以下のサンプルコードは、複雑な条件を組み合わせてsortedByを活用する例です。商品の価格を基準にしつつ、同じ価格帯なら名前の長さで並べ替えるといった処理も簡単に書けることがわかります。
複数条件で並べ替えるサンプルコード
data class Item(val name: String, val price: Int)
fun main() {
val items = listOf(
Item("りんご", 300),
Item("みかん", 300),
Item("ぶどう", 500),
Item("キウイ", 300)
)
val sortedItems = items.sortedBy { it.price }
.sortedBy { it.name.length }
println(sortedItems)
}
このように複数のsortedByを組み合わせることで、より細かい並べ替えが実現でき、データの分析や表示において非常に役立ちます。アプリ開発や業務システムの画面表示にも役立つため、Kotlin初心者であってもぜひ身につけておきたい重要な部分です。
並べ替えの仕組みを理解しておくと、ほかの処理にも応用が利きます。例えば、検索結果のフィルタリング後に並び替えを行って見やすくしたり、ランキング形式の一覧を作ったりすることも簡単になります。並べ替えは地味な操作に見えますが、データを扱うすべてのアプリケーションにおいて重要な要素であるため、正しい知識を身につけておくことが大切です。
今回学んだsorted、sortedBy、sortedDescending、sortedByDescendingの違いと使い分けをしっかり理解しておけば、さまざまなコレクション操作がより自然に書けるようになります。実際の開発でも、データの順序を整える技術は頻繁に必要となるため、今後の学習や実践に大いに役立つでしょう。
生徒
「先生、sortedとsortedByを比べてみると、用途に応じて使い分けることが大事なんだとよく分かりました。特にデータクラスの並べ替えは実用的だと思いました。」
先生
「その通りですよ。実際のアプリでは、名前順や価格順、日付順など、さまざまな並べ替えが必要になります。sortedByはそうした実用的な場面でとても役立つので、ぜひ覚えておいてください。」
生徒
「降順で並べ替える関数も分かりやすかったです。sortedDescendingやsortedByDescendingは、ランキングを作りたいときにも使えそうですね。」
先生
「ええ、その通りです。並べ替えの仕組みを理解しておけば、データの見せ方を自由に工夫できるようになります。今回の内容を実際にプログラムで試してみると、さらに理解が深まりますよ。」
生徒
「ありがとうございます。今日の内容をしっかり復習して、もっと複雑なデータの処理にも挑戦してみます!」
先生
「それが一番大切です。基本を押さえれば応用はどんどん広がるので、焦らず丁寧に進めていきましょう。」