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.

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()

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

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


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.


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}

0

Itu telah berubah pada versi RC.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.