Nasıl Harita için Kotlin dönüştüğünde için?


170

Örneğin ben gibi dizelerin bir listesi var:

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

ve ben bir dizeye anahtarları olduğu bir haritaya dönüştürmek istiyorum.

.toMap()İşlevi kullanmam gerektiğini biliyorum , ama nasıl olduğunu bilmiyorum ve herhangi bir örnek görmedim.

Yanıtlar:


318

İki seçeneğiniz var:

İlk ve en yüksek performans, associateByanahtar ve değer üretmek için iki lambda alan ve haritanın oluşturulmasını satır içine alan işlevi kullanmaktır :

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

İkincisi, daha az performans, son haritayı oluşturmak için kullanılabilecek mapbir liste oluşturmak için standart işlevi kullanmaktır :PairtoMap

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

1
teşekkür ederim. bir harita oluşturduğundan ve bir çift listesini örneğimdeki gibi bir haritaya dönüştürmediğinden daha hızlı mıdır?
LordScone

4
@lordScone Tam olarak, Pairörnek tahsisi büyük koleksiyonlar için çok pahalı olabilir
votka

41

Gönderen Listetmek Mapile associateişlevin

Kotlin 1.3 ile Listadlandırılan bir işlevi vardır associate. associateaşağıdaki beyanı içerir:

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

Belirli bir koleksiyonun öğelerine uygulanan işlev Maptarafından sağlanan anahtar / değer çiftlerini döndürür transform.

Kullanımı:

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

Gönderen Listetmek Mapile associateByişlevin

Kotlin ile Listadlandırılan bir işlevi vardır associateBy. associateByaşağıdaki beyanı içerir:

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

Belirli bir koleksiyonun öğelerine uygulanan işlevler tarafından Mapsağlanan valueTransformve dizinlenen değerleri içeren bir döndürür keySelector.

Kullanımı:

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
Associate ve associateBy arasındaki fark nedir? Aynı sonucu ürettiklerini görünce birini diğerinin üzerinde kullanmayı tercih eder miyim?
waynesford

11
  • Yinelenebilir Bir Dizi Öğesini kotlin'deki Haritaya Dönüştürme,
  • ilişkilendirmek vs ilişkilendirmekBy vs ilişkilendirmek

* Referans: Kotlin Belgeleri

1- ilişkilendirme (her iki Anahtar ve Değerleri ayarlamak için): Anahtar ve değer öğelerini ayarlayabilen bir harita oluşturun:

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

İki çiftten herhangi biri aynı anahtara sahip olursa, sonuncusu haritaya eklenir.

Döndürülen harita, orijinal dizinin giriş yineleme sırasını korur.

2- associateBy (sadece tuşları hesaplama ile ayarlayın): Yeni Anahtarlar ayarlayabileceğimiz bir harita oluşturun, değerler için benzer elemanlar ayarlanacaktır

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

3- associateWith (sadece hesaplamalara göre Değerleri ayarlayın): Yeni Değerler ayarlayabileceğimiz bir harita oluşturun, Tuşlar için benzer öğeler ayarlanacaktır

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

Kotlin ipuçlarından örnek: resim açıklamasını buraya girin


10

associateBu görev için kullanabilirsiniz :

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

Bu örnekte, gelen dizeler listanahtarlar ve karşılık gelen uzunlukları (örnek olarak) haritanın içindeki değerler olur.


7

Eğer varsa çiftleri kaybetmek istemiyorum listenizde, kullanmakta yapabilirsiniz groupBy.

Aksi takdirde, herkesin söylediği gibi, kullanın associate/By/With(kopyalar söz konusu olduğunda, sadece bu anahtarla son değeri döndürür).

Kişi listesini yaşa göre gruplandıran bir örnek:

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

Sonuçlar:

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

0

Bu RC versiyonunda değişti.

Ben kullanıyorum val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.