Kotlin で複数のフィールドを使用してコレクションを並べ替える

David Mbochi Njonge 2023年6月20日
  1. Kotlin プロジェクトを生成する
  2. 個々のプロパティを使用してコレクションを並べ替える
  3. 複数のプロパティを使用してコレクションを並べ替える
  4. まとめ
Kotlin で複数のフィールドを使用してコレクションを並べ替える

Kotlin ライブラリは、開発者が要件に基づいて活用できるさまざまな方法を提供します。 このチュートリアルでは、個々のフィールドと複数のフィールドを使用してコレクションを並べ替える方法を説明します。

Kotlin プロジェクトを生成する

IntelliJ 開発環境を開き、File > New > Project を選択します。 プロジェクト名をkotlin-sortbyと入力し、言語セクションでKotlinを選択し、ビルド システムセクションでIntellijを選択します。

最後に、Create ボタンを押してプロジェクトを生成します。 src/main/kotlin フォルダーの下に Main.kt という名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

コード:

import java.time.Year

data class Book(val id: Int,
                val name: String,
                val yearPublished: Year)

fun fetchBooks(): ArrayList<Book>{
    return arrayListOf(
        Book(1,"Java Arrays", Year.of(1984)),
        Book(2,"Python Arrays",Year.of(2021)),
        Book(3,"Pascal for loop",Year.of(2022)),
        Book(4,"Pascal Arrays",Year.of(2021)),
        Book(5,"Java for loop",Year.of(2022))
    )
}

このコードでは、Book データ クラスを使用して作成されたブック オブジェクトの List を返す fetchBooks() という名前のメソッドを作成しました。 このリストを例で使用して、さまざまな基準に基づいて本を並べ替える方法を確認します。

個々のプロパティを使用してコレクションを並べ替える

fetchBooks() メソッドの後に、次のコード例をコピーして Main.kt ファイルに貼り付けます。

sortBy() メソッドを使用してコレクションをソートする

次の例では、sortBy() メソッドを使用して yearPublished フィールドを使用して以前に作成したリストを並べ替える usingSortBy() という名前のメソッドを作成します。

sortBy() メソッドは MutableList の拡張関数であり、値を返しません。 関数には、適用されるセレクター関数の前に crossinline キーワードがあります。これは、セレクター関数がローカル以外の戻り値を許可しないことを意味します。

セレクター関数は、裏で Comparable インターフェイスを使用して、リスト内の要素を並べ替えていることに注意してください。

コード:

fun usingSortBy(){
    val books = fetchBooks()
    books.sortBy(Book::yearPublished)
    books.forEach(::println);
}

fun main(){
    usingSortBy();
}

出力:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=2, name=Python Arrays, yearPublished=2021)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=5, name=Java for loop, yearPublished=2022)

sortedBy() メソッドを使用してコレクションをソートする

コレクション フレームワークは、この例では取得できなかった新しいリストを返すことができる sortBy() メソッドの代替手段を提供します。 Iterable インターフェイスの拡張関数である sortedBy() メソッドを使用できます。

コード:

fun usingSortedBy(){
    fetchBooks().sortedBy(Book::yearPublished)
        .forEach(::println);
}

fun main(){
    usingSortedBy();
}

出力:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=2, name=Python Arrays, yearPublished=2021)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=5, name=Java for loop, yearPublished=2022)

sortedBy() メソッドは、セレクター関数を使用してソートされた要素を含むリストを返します。返されたリストで forEach() メソッドを呼び出して、オブジェクトをコンソールに記録できます。

複数のプロパティを使用してコレクションを並べ替える

前の例で、単一のフィールドを使用して要素を並べ替える方法を見てきました。 ただし、クライアントがアプリケーション内の複数のフィールドに基づいて並べ替えたい場合があります。

このセクションでは、この機能を実現する方法を学びます。

sortWith() メソッドを使用してコレクションをソートする

この例では、sortWith() メソッドを使用して、本の 名前 の後に本の を使用してリストをソートする usingSortWith() という名前のメソッドを作成しました。

sortWith() メソッドは MutableList の拡張関数であり、Comparator を返す任意の引数を受け入れます。 このメソッドは値を返さないことに注意してください。

コード:

fun usingSortWith(){
    val books = fetchBooks();
    books.sortWith(compareBy(Book::name, Book::yearPublished));
    books.forEach(::println);
}

fun main(){
    usingSortWith();
}

sortWith() メソッドの引数として compareBy() メソッドを使用しました。 compareBy() メソッドは Comparator を返し、複数のセレクター関数でオーバーロードして、さまざまなプロパティに基づいてリストを並べ替えることができます。

セレクター関数定義の前に追加された vararg キーワードは、複数の引数を渡すことができることを示しています。

出力:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=5, name=Java for loop, yearPublished=2022)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=2, name=Python Arrays, yearPublished=2021)

sortedWith() メソッドを使用してコレクションをソートする

コレクション フレームワークは、並べ替えられた要素を含む新しいリストを返すことができる sortWith() メソッドの代替手段を提供します。 sortedWith() メソッドを使用してこの機能を実現できます。

sortedWith() メソッドは Iterable インターフェイスの拡張関数であり、Comparator を返す任意の引数を受け入れます。

コード:

fun usingSortedWith(){
    fetchBooks().sortedWith(compareBy(Book::name, Book::yearPublished))
        .forEach(::println);
}

fun main(){
    usingSortedWith();
}

前の例のように Comparator を返す compareBy() を使用し、それをオーバーロードして、名前と年を使用してリストを並べ替えました。

出力:

Book(id=1, name=Java Arrays, yearPublished=1984)
Book(id=5, name=Java for loop, yearPublished=2022)
Book(id=4, name=Pascal Arrays, yearPublished=2021)
Book(id=3, name=Pascal for loop, yearPublished=2022)
Book(id=2, name=Python Arrays, yearPublished=2021)

まとめ

このチュートリアルでは、目的の基準に基づいてリストを並べ替えるために使用できるさまざまな方法を学びました。 ここで説明したアプローチには、sortBy() メソッドの使用、sortedBy() メソッドの使用、sortWith() メソッドの使用、および sortedWith() メソッドの使用が含まれます。

他の 2つの並べ替え戦略を使用すると、リストを降順に並べ替えることができ、sortByDescending()sortedByDescending() が含まれていることに注意してください。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub