जवाबों:
आपके पास दो विकल्प हैं:
पहला और सबसे associateByमहत्वपूर्ण कार्य ऐसे फ़ंक्शन का उपयोग करना है जो कुंजी और मान उत्पन्न करने के लिए दो लैम्ब्डा लेता है, और नक्शे के निर्माण को रेखांकित करता है:
val map = friends.associateBy({it.facebookId}, {it.points})
दूसरा, कम प्रदर्शन करने वाला, अंतिम mapसूची तैयार करने के लिए मानक फ़ंक्शन का उपयोग Pairकर सकता है , जिसकी सूची बनाई जा सकती है toMap:
val map = friends.map { it.facebookId to it.points }.toMap()
Pairउदाहरणों के आवंटन बड़े संग्रह के लिए बहुत महंगे हो सकते हैं
Listकरने के लिए Mapके साथ associateसमारोहकोटलिन 1.3 के साथ, Listएक फ़ंक्शन कहा जाता है associate। 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}
}
Listकरने के लिए Mapके साथ associateByसमारोहकोटलिन के साथ, Listएक समारोह कहा जाता है associateBy। 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}
}
* संदर्भ: कोटलिन प्रलेखन
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 , ...}
यदि आपके पास अपनी सूची में डुप्लिकेट हैं , जिसे आप खोना नहीं चाहते हैं, तो आप इसका उपयोग कर सकते हैं 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}