web-dev-qa-db-ja.com

Kotlinでリストをマップに変換する方法は?

たとえば、次のような文字列のリストがあります。

val list = listOf("a", "b", "c", "d")

そして、文字列がキーとなるマップに変換したいと思います。

.toMap()関数を使用する必要があることは知っていますが、方法はわかりません。また、その例も見ていません。

120
LordScone

次の2つの選択肢があります。

最初で最もパフォーマンスが高いのは、キーと値の生成に2つのラムダを使用し、マップの作成をインライン化するassociateBy関数を使用することです。

val map = friends.associateBy({it.facebookId}, {it.points})

2番目のパフォーマンスの低い方法は、標準のmap関数を使用してPairのリストを作成し、toMapが最終マップを生成するために使用できるようにすることです。

val map = friends.map { it.facebookId to it.points }.toMap()
240
voddan

#1。 List関数を使用したMapからassociate

Kotlin 1.3では、Listassociate という関数があります。 associateには次の宣言があります。

fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>

指定されたコレクションの要素に適用されるMap関数によって提供されるキーと値のペアを含むtransformを返します。

使用法:

class Person(val name: String, val id: Int)

fun main() {
    val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
    val map = friends.associate({ Pair(it.id, it.name) })
    //val map = friends.associate({ it.id to it.name }) // also works

    println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}    

#2。 List関数を使用したMapからassociateBy

Kotlinでは、ListassociateBy という関数があります。 associateByには次の宣言があります。

fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>

Mapによって提供され、指定されたコレクションの要素に適用されるvalueTransform関数によってインデックス付けされた値を含むkeySelectorを返します。

使用法:

class Person(val name: String, val id: Int)

fun main() {
    val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
    val map = friends.associateBy(keySelector = { person -> person.id }, valueTransform = { person -> person.name })
    //val map = friends.associateBy({ it.id }, { it.name }) // also works

    println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}
29
Imanou Petit

このタスクには associate を使用できます。

val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }

この例では、listの文字列がキーになり、対応する長さ(例として)がマップ内の値になります。

6
s1m0nw1
  • 反復可能なシーケンス要素をkotlinのマップに変換します。
  • associate vs AssociatedBy vsAssociateWith:

1-アソシエイト(ケイズとバリューを設定可能):キーとバリューの要素を設定できるマップを作成します:

IteratableSequenceEements.associate { newKey to newValue } => Map {newKey : 
 newValue ,...}

2 -associateBy(計算によってキーを設定するだけ):新しいキーを設定できるマップを作成します。類似した要素が値に設定されます

IteratableSequenceEements.associateBy { newKey } => Map {newKey : 'Values will 
be set  from IteratableSequenceEements' ,...}

3- AssociatedWith(計算により値を設定するだけ):新しい値を設定できるマップを作成します。類似した要素がキーに設定されます

IteratableSequenceEements.associateWith { newValue } => Map { 'Keys will be set 
from IteratableSequenceEements' : newValue , ...}

Kotlinのヒントの例: enter image description here

0
Hamed Jaliliani

RCバージョンでは変更されています。

val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })を使用しています

0
lagos