質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1028閲覧

sortByの使い方について

tokumei000

総合スコア17

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/03/28 00:37

sortByの使い方について質問です。

独自に作成したクラスを格納したリストがあるとします。
そのリストをクラス内の特定のプロパティでソートしたいと考えていました。
調べているとMutableList#sortByを使えば実現できそうだったのですが、リファレンスを見ても引数として何を渡すべきなのかよくわからなかったので質問させていただきました。

以下はリファレンスに載っていたコードと説明です。
(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sort-by.html)

kotlin

1inline fun <T, R : Comparable<R>> MutableList<T>.sortBy( 2 crossinline selector: (T) -> R?)

Sorts elements in the list in-place according to natural sort order of the value returned by specified selector function.

これは引数として「(T)を渡すとR?を返す関数」を渡すという意味で合ってますでしょうか?((T)がリストの要素のことな気はするのですがR?が何なのかよくわかっていない)
また、説明のところに「selector function」とあるのですがこれがどういう関数なのかもわかりません。(要素から何を基準にソートするか選ぶ関数的な意味として使われているのでしょうか...?)

試しに以下のようなコードを書いて実行してみると上手く動作はするのですがいまいち理解できていません。(名前と年齢のプロパティを持つPersonクラスを格納したリストを年齢でソート)
これは引数として「リストの要素を渡すと要素のプロパティ(age)を返す関数」を渡していることになると思うのですが、上記のリファレンスに対する自分の認識と違うことになります(Comparable<R>とやらを返していない)

kotlin

1fun main(){ 2 3 val list: MutableList<Person> = mutableListOf() 4 5 list.add(Person("Alice", 22)) 6 list.add(Person("Bob", 16)) 7 list.add(Person("Carol", 25)) 8 9 list.sortBy { it.age } 10 println(list) 11} 12 13data class Person(val name: String, val age: Int)

質問をまとめると以下の2点です。

  1. sortByの引数として何を渡すのが正しいのか?
  2. 「selector function」とはどういうものか?(どういう意味で使われているのか)

まだまだ勉強し始めたばかりなのでリファレンスの見方やkotlinの文法をしっかり理解できていないのが原因だとは思いますがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sortByの引数として何を渡すのが正しいのか?
「selector function」とはどういうものか?(どういう意味で使われているのか)

Comparable(比較可能)なものを返す「selector function」を渡します。
例えば提示されたit.ageだと、それぞれ22、16、25が返され、その3つの昇順で比較されPersonオブジェクトがソートされます。

Kotlin

1inline fun <T, R : Comparable<R>> MutableList<T>.sortBy( 2 crossinline selector: (T) -> R?)

はComparableを実装したRを返すTを指定することを示しています。
IntはComparableを実装しているので、it.ageは問題なく比較できます。

複雑なソート条件の場合は自分でComparableを返すfunctionを作ってソートさせることができます。

投稿2020/03/28 04:16

nakasho_dev

総合スコア2655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokumei000

2020/03/28 09:51

IntはComparableを実装しているから問題なかったのですね、理解できましたありがとうございます。 ちなみに「R : Comparable<R>」の「R」は何か英単語の略だったりするのでしょうか?(Tがtypeの略みたいに)
nakasho_dev

2020/03/28 10:59

GenericsについてTypeにはTを使わなければいけないということはないです。なぜRなのかは推測するしかないのですがReturn(返却値)のことを現わしているかもしれません。
tokumei000

2020/03/28 13:23

Returnが由来になってる可能性があるんですね、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問