जवाबों:
आपके पास दो विकल्प हैं:
पहला और सबसे 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}