Unit3-1(1)


collection


コレクションは、単語リストや従業員レコードセットなどの関連項目グループです.コレクション内のアイテムは、ソートされていないものでも、一意であっても、一意でなくてもよい.カタログもコレクションの一種です.

set


Kotlinのもう一つの集合タイプは集合です.リストとは異なり、重複する要素は使用できません.
val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2)
println("list:   ${numbers}")
println("sorted: ${numbers.sorted()}")
val setOfNumbers = numbers.toSet()
println("set:    ${setOfNumbers}")
実行結果
list:   [0, 3, 8, 4, 0, 5, 5, 8, 9, 2]
sorted: [0, 0, 2, 3, 4, 5, 5, 8, 8, 9]
set:    [0, 3, 8, 4, 5, 9, 2]
ディレクトリtoSet()を利用して集合に変換すると、重複する要素は自動的に消えてしまう.
そして集合には順序がない.
val set1 = setOf(1,2,3)
val set2 = mutableSetOf(3,2,1)
println("$set1 == $set2: ${set1 == set2}")
実行結果
[1, 2, 3] == [3, 2, 1]: true
集合で実行できる基本的な操作の1つは、contains()関数を使用して、特定の項目が集合に属しているかどうかを決定することです.
println("contains 7: ${setOfNumbers.contains(7)}")
これに加えて、交差または並列セットのような演算は、intersect()またはunion()を使用して実行されてもよい.

Map


地図や辞書も集合タイプの一つです.マッピングは、特定のキーによって与えられた値を簡単に検索するためのキー値ペアのセットです.
fun main() {
    val peopleAges = mutableMapOf<String, Int>(
        "Fred" to 30,
        "Ann" to 23
    )
    println(peopleAges)
    
    //항목을 더 추가하려는 경우
    peopleAges.put("Barbara", 42)
    //혹은
    peopleAges["Joe"] = 51
}
実行結果
{Fred=30, Ann=23, Barbara=42, Joe=51}
既存の鍵ペアの値を更新することもできます.
peopleAges["Fred"] = 31 //이제 프레드의 나이는 31살

forEach


リストされたセット内のすべてのオブジェクトが通常のタスクであるため、KotlinはforEach()を提供し、すべてのプロジェクトを自動的に参照し、プロジェクトごとにタスクを実行します.
peopleAges.forEach { print("${it.key} is ${it.value}, ") }
実行結果
Fred is 31, Ann is 23, Barbara is 42, Joe is 51,
forEachは、現在の項目を指定する変数の代わりに、特別な識別子itを使用する.

map


上から出てきたMapとは違います!map関数は、セット内の各アイテムに変換を適用します.
上のforEachの実行結果から最後のカンマを削除するために.
println(peopleAges.map { "${it.key} is ${it.value}" }.joinToString(", ") )
実行結果
Fred is 31, Ann is 23, Barbara is 42, Joe is 51
peopleAges.mapは、peopleAgesの各項目に変換を適用し、変換項目からなる新しいセットを作成する.
かっこの一部は、各アイテムに適用されるフォーマットのコピーを定義します.キー値ペアを取得し、文字列に変換します.例えば、は、Fred is 31に変換される.joinToString(", ")は、変換セット内の各アイテムを文字列に追加し、最後のアイテムに記号を追加することなく区切りを使用します.
これらのすべてのプロセスは、点演算子(.)によって結合されている.

filter


コレクションのもう1つのタスクは、特定の条件に一致するアイテムを検索することです.filter()関数は、式に基づいたコレクションの一致を返します.
呼び出しfilterは括弧を必要とせず、itはリスト内の現在のエントリを表す.
val filteredNames = peopleAges.filter { it.key.length < 4 }
println(filteredNames)
実行結果
{Ann=23, Joe=51}

ブルーダ


前に習ったコード
peopleAges.forEach { print("${it.key} is ${it.value}") }
forEachの後には、関数名の後のカッコ{}ではなく、パラメータを含むカッコが使用されていることがわかります.mapおよびfilterも同様である.
括弧で小関数を作成するのと同じですが、関数名はありません.このような名前がなく、式として直接使用できる関数は、ramda式または略称ramdaと呼ばれる非常に有用な概念である.

たとえば、パラメータに3を乗じたRamda式を定義し、上記のように変数3に関数を入れます.(Int)->Intは関数のタイプを定義し、パラメータはintであり、戻り値はintである.
fun main() {
    val triple: (Int) -> Int = { a: Int -> a * 3 }
    println(triple(5)) //실행결과: 15
}
パラメータの明示的な宣言(a: Int)は省略でき、関数矢印(->)は省略され、関数本文のみが使用されます.
val triple: (Int) -> Int = { it * 3 }

高次関数


高次関数は、関数(この場合ramda)を別の関数に渡すか、別の関数から関数を返すことを意味します.mapfilterforEachの関数はいずれもパラメータを関数(印刷文、if文など)として使用するため、高次関数の例である.
文字列リストをディクショナリソートするには、組み込まれたsorted()メソッドをコレクションに使用します.ただし、文字列の長さに基づいてリストをソートするには、2つの文字列の長さを取得して比較するコードを記述する必要があります.Kotlinでは、ランダをsortedWith()メソッドに渡して記述することができる.sortedWith()も高次関数の例である.
println(peopleNames.sortedWith { str1: String, str2: String -> str1.length - str2.length })
2つのstringがパラメータとして使用される理由は、2つのオブジェクトの長さを比較して、どの名前が短いかを知るためです.これにより、sortedWithは、必要に応じてすべての比較演算を実行し、名前の長さの短い順序で昇順に並べ替える.
PythonならpeopleNames.sort(key=len)個で終わりです取って...