Kotlin में List को Map में कैसे बदलें?


169

उदाहरण के लिए मेरे पास तार की सूची है जैसे:

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

और मैं इसे एक नक्शे में बदलना चाहता हूं, जहां तार की चाबियाँ हैं।

मुझे पता है कि मुझे .toMap()फ़ंक्शन का उपयोग करना चाहिए , लेकिन मुझे नहीं पता कि कैसे, और मैंने इसका कोई उदाहरण नहीं देखा है।

जवाबों:


317

आपके पास दो विकल्प हैं:

पहला और सबसे associateByमहत्वपूर्ण कार्य ऐसे फ़ंक्शन का उपयोग करना है जो कुंजी और मान उत्पन्न करने के लिए दो लैम्ब्डा लेता है, और नक्शे के निर्माण को रेखांकित करता है:

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

दूसरा, कम प्रदर्शन करने वाला, अंतिम mapसूची तैयार करने के लिए मानक फ़ंक्शन का उपयोग Pairकर सकता है , जिसकी सूची बनाई जा सकती है toMap:

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

1
धन्यवाद। क्या यह तेज है क्योंकि यह एक मानचित्र बनाता है, और मेरे उदाहरण में जोड़े की सूची को मानचित्र में परिवर्तित नहीं करता है?
लॉर्ड्सकॉन

4
@lordScone वास्तव में, Pairउदाहरणों के आवंटन बड़े संग्रह के लिए बहुत महंगे हो सकते हैं
वोडन

41

से Listकरने के लिए Mapके साथ associateसमारोह

कोटलिन 1.3 के साथ, Listएक फ़ंक्शन कहा जाता है associateassociateनिम्नलिखित घोषणा है:

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

से Listकरने के लिए Mapके साथ associateByसमारोह

कोटलिन के साथ, Listएक समारोह कहा जाता है associateByassociateByनिम्नलिखित घोषणा है:

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

3
सहयोगी और सहयोगी के बीच अंतर क्या है? क्या मैं एक दूसरे का उपयोग करना पसंद करना चाहूंगा, यह देखते हुए कि वे उसी परिणाम का उत्पादन करते हैं?
वेन्सफोर्ड

11
  • कोटलिन में एक इरिटेबल सीक्वेंस एलिमेंट्स को मैप में कन्वर्ट करें,
  • सहयोगी बनाम सहयोगी

* संदर्भ: कोटलिन प्रलेखन

1- सहयोगी (कुंजी और मूल्य दोनों को सेट करने के लिए): एक नक्शा बनाएँ जो कुंजी और मूल्य तत्वों को सेट कर सकता है:

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

यदि दो में से किसी भी जोड़े में एक ही कुंजी होगी तो आखिरी में नक्शे में जोड़ा जाएगा।

लौटा हुआ नक्शा मूल सरणी के प्रवेश पुनरावृत्ति क्रम को संरक्षित करता है।

2- सहयोगी (केवल गणना द्वारा कुंजी सेट करें): एक नक्शा बनाएं जिसे हम नई कुंजी सेट कर सकते हैं, अनुरूप तत्वों को मूल्यों के लिए सेट किया जाएगा

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

3- एसोसिएटविथ (सिर्फ गणना द्वारा मान सेट करें): एक नक्शा बनाएं जिसे हम नए मान सेट कर सकते हैं, अनुरूप तत्वों को सेट किया जाएगा

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

कोटलिन सुझावों से उदाहरण: यहां छवि विवरण दर्ज करें


10

आप associateइस कार्य के लिए उपयोग कर सकते हैं :

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

इस उदाहरण में, listकुंजी से तार और उनकी संबंधित लंबाई (उदाहरण के रूप में) मानचित्र के अंदर के मान बन जाते हैं।


7

यदि आपके पास अपनी सूची में डुप्लिकेट हैं , जिसे आप खोना नहीं चाहते हैं, तो आप इसका उपयोग कर सकते हैं groupBy

अन्यथा, जैसा कि बाकी सभी ने कहा, उपयोग करें associate/By/With(जो कि डुप्लिकेट के मामले में, मुझे विश्वास है, केवल उस कुंजी के साथ अंतिम मूल्य लौटाएगा)।

उम्र के हिसाब से लोगों की सूची बनाने वाला एक उदाहरण:

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

परिणाम:

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

0

आरसी संस्करण पर यह बदल गया है।

मै इस्तेमाल कर रहा हूँ val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.