Bagaimana cara mengubah Daftar ke Peta di Kotlin?

169

Misalnya saya punya daftar string seperti:

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

dan saya ingin mengubahnya menjadi peta, di mana string adalah kuncinya.

Saya tahu saya harus menggunakan .toMap()fungsi ini, tetapi saya tidak tahu caranya, dan saya belum melihat contohnya.

LordScone
sumber

Jawaban:

317

Anda memiliki dua pilihan:

Performan pertama dan yang paling banyak adalah menggunakan associateByfungsi yang mengambil dua lambdas untuk menghasilkan kunci dan nilai, dan menguraikan pembuatan peta:

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

Yang kedua, yang kurang performan, adalah menggunakan mapfungsi standar untuk membuat daftar Pairyang dapat digunakan toMapuntuk menghasilkan peta akhir:

val map = friends.map { it.facebookId to it.points }.toMap()
voddan
sumber
1
Terima kasih. apakah ini lebih cepat karena ia membuat peta, dan tidak mengonversi daftar pasangan ke peta, seperti dalam contoh saya?
LordScone
4
@lordScone Persis, alokasi Pairinstance mungkin sangat mahal untuk koleksi besar
voddan
41

Dari List ke Mapdengan associatefungsi

Dengan Kotlin 1.3, Listmemiliki fungsi yang disebut associate. associatememiliki deklarasi berikut:

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

Pengembalian a Map pasangan nilai kunci yang disediakan oleh transformfungsi yang diterapkan ke elemen koleksi yang diberikan.

Pemakaian:

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}
}    

Dari List ke Mapdengan associateByfungsi

Dengan Kotlin, Listmemiliki fungsi yang disebut associateBy. associateBymemiliki deklarasi berikut:

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

Mengembalikan yang Mapberisi nilai-nilai yang disediakan olehvalueTransform dan diindeks oleh keySelectorfungsi yang diterapkan ke elemen dari koleksi yang diberikan.

Pemakaian:

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}
}
Imanou Petit
sumber
3
Apa perbedaan antara associate dan associateBy? Apakah saya ingin lebih suka menggunakan yang satu daripada yang lain, melihat bahwa mereka menghasilkan hasil yang sama?
waynesford
11
  • Mengonversi Elemen Urutan yang Berterangi ke Peta di kotlin,
  • associate vs associateBy vs associate Dengan:

*Referensi: Dokumentasi Kotlin

1- associate (untuk mengatur Kunci & Nilai): Buat peta yang dapat mengatur elemen kunci & nilai:

IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}

Jika salah satu dari dua pasangan memiliki kunci yang sama, yang terakhir ditambahkan ke peta.

Peta yang dikembalikan mempertahankan urutan iterasi entri dari array asli.

2- associateBy (cukup atur Tombol dengan perhitungan): Buat peta yang bisa kita atur Tombol baru, elemen analog akan ditetapkan untuk nilai

IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set  from analogous IterableSequenceElements' ,...}

3- associateWith (cukup tetapkan Nilai dengan perhitungan): Buat peta yang bisa kita atur Nilai baru, elemen analog akan ditetapkan untuk Kunci

IterableSequenceElements.associateWith { newValue }  //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}

Contoh dari tips Kotlin: masukkan deskripsi gambar di sini

Hamed Jaliliani
sumber
10

Anda dapat menggunakan associateuntuk tugas ini:

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

Dalam contoh ini, string dari listmenjadi kunci dan panjangnya yang sesuai (sebagai contoh) menjadi nilai di dalam peta.

s1m0nw1
sumber
7

Jika Anda memiliki duplikat dalam daftar yang tidak ingin hilang, Anda dapat melakukannya menggunakan ini groupBy.

Kalau tidak, seperti kata orang lain, gunakan associate/By/With (yang dalam kasus duplikat, saya percaya, hanya akan mengembalikan nilai terakhir dengan kunci itu).

Contoh pengelompokan daftar orang berdasarkan usia:

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

fun main() {
    val people = listOf(Person("Sue Helen", 31), Person("JR", 25), Person("Pamela", 31))

    val duplicatesKept = people.groupBy { it.age }
    val duplicatesLost = people.associateBy({ it.age }, { it })

    println(duplicatesKept)
    println(duplicatesLost)
}

Hasil:

{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}
cs_pupil
sumber
0

Itu telah berubah pada versi RC.

saya menggunakan val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })

lagos
sumber