কোটলিন - অ্যারে থেকে সদৃশ স্ট্রিংগুলি সরানোর আইডিয়োমেটিক উপায়?


উত্তর:


213

distinctএক্সটেনশন ফাংশনটি ব্যবহার করুন :

val a = arrayOf("a", "a", "b", "c", "c")
val b = a.distinct() // ["a", "b", "c"]

এখানে distinctByফাংশন রয়েছে যা আইটেমগুলি কীভাবে আলাদা করতে হয় তা নির্দিষ্ট করার অনুমতি দেয়:

val a = listOf("a", "b", "ab", "ba", "abc")
val b = a.distinctBy { it.length } // ["a", "ab", "abc"]

হিসাবে @ mfulton26 প্রস্তাব, এছাড়াও আপনি ব্যবহার করতে পারেন toSet, toMutableSetএবং, আপনি মূল ক্রম সংরক্ষিত করা প্রয়োজন হবে না, toHashSet। এই ফাংশনগুলি একটিগুলির Setপরিবর্তে একটি উত্পাদন করে Listএবং এর চেয়ে কিছুটা বেশি দক্ষ হওয়া উচিত distinct


আপনি দরকারী খুঁজে পেতে পারেন:


4
আপনি ব্যবহার করতে পারেন toSetবা toMutableSetযার ওভারহেড কম রয়েছে distinctএবং যদি অর্ডারে আপনি ব্যবহার করতে পারেন তবে তাতে কিছু আসে যায় না toHashSet
mfulton26

@ এমফুল্টন 26, অবশ্যই এর সর্বদা ওভারহেড থাকে না। উদাহরণস্বরূপ, কোনও জেপিএ সত্তা অবজেক্টের অলস বোঝা ক্ষেত্র থাকতে পারে, তাই সম্পূর্ণ তুলনা সম্পাদন করার চেয়ে আইডি দিয়ে এর সংগ্রহটি আলাদা করা আরও দক্ষ
বাকস্ট্যাব

4
@ বকস্টাব্যু আমি দেখতে পেয়েছি, আমি বিশ্বাস করি যে আমরা দুটি ভিন্ন ইস্যু নিয়ে কথা বলছি: 1) এর to*Setচেয়ে বেশি দক্ষ (স্থান ও সময়) distinct[By]কারণ এটি অভ্যন্তরীণভাবে Setব্যবহার করার পরিবর্তে সরাসরি প্রত্যাবর্তন করে Setএবং Listএটির ফেরত মূল্য হিসাবে রূপান্তর করে 2) distinctByহয় distinctআপনি সম্পূর্ণ বস্তুর সমতার তুলনা এড়াতে পারবেন বলেই আরও দক্ষ হতে পারে। উভয়ই বৈধ পয়েন্ট। আমি আপনার বক্তব্যটি নিয়ে ছুটে এসেছি যে "অবশ্যই এটি সর্বদা ওভারহেড রাখে না" এবং আমি সেটির জবাব দিচ্ছিলাম এবং উপেক্ষা করেছি যে আপনি তুলনা distinctকরছেন distinctBy(এবং সাথে নয় to*Set)।
mfulton26

4
@ mfulton26, আপনি সঠিক আছেন। আমি বেশিরভাগই বোঝাতে চেয়েছিলাম যে কখনও কখনও সেট + এর চেয়ে তালিকা + আলাদা ব্যবহার করা ভাল, কারণ সেটটি নিবিড়ভাবে সমান / হ্যাশকোড ব্যবহার করে যা সম্ভবত কল করা ব্যয়বহুল হতে পারে
বাকস্ট্যাব

4
লেখার সময়, Iterable.distinctআসলে toMutableSet().toList()অভ্যন্তরীণভাবে করে। সুতরাং কর্মক্ষমতা সম্পর্কে চিন্তা করবেন না :-)
লূক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.