কোটলিনে মানচিত্রের তালিকাটি কীভাবে রূপান্তর করবেন?


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
@ লর্ডস্কোন হুবহু, Pairদৃষ্টান্তের বরাদ্দ বড় সংগ্রহের জন্য খুব ব্যয়বহুল হতে পারে
ভদদান

41

থেকে Listথেকে Mapসঙ্গে associateফাংশন

কোটলিন ১.৩ সহ 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 })

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.