Kotlin - सरणी से डुप्लिकेट स्ट्रिंग्स को हटाने के लिए मुहावरेदार तरीका?


जवाबों:


198

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


आप उपयोगी पा सकते हैं:


5
आप उपयोग कर सकते हैं toSetया toMutableSetजिनके पास ओवरहेड की तुलना में कम है distinctऔर यदि ऑर्डर करने से कोई फर्क नहीं पड़ता है तो आप उपयोग कर सकते हैं toHashSet
mfulton26

@ mfulton26, निश्चित रूप से यह हमेशा ओवरहेड नहीं होता है। उदाहरण के लिए, एक जेपीए इकाई वस्तु में आलसी लोड वाले खेत हो सकते हैं, इसलिए यह पूरी तरह से तुलना करने के बजाय आईडी द्वारा अपने संग्रह को अलग करने के लिए अधिक कुशल है
बकस्टब्यू

2
@ टकस्टब्यू मैं देखता हूं, मेरा मानना ​​है कि हम दो अलग-अलग मुद्दों के बारे में बात कर रहे हैं: 1) to*Setअधिक कुशल (स्थान और समय) की तुलना में अधिक है distinct[By]क्योंकि यह आंतरिक रूप Setसे उपयोग करने के बजाय सीधे रिटर्न देता है Setऔर इसे Listअपने वापसी मूल्य और 2 के रूप में परिवर्तित करता distinctByहै। distinctकेवल इसलिए की तुलना में अधिक कुशल हो सकता है क्योंकि आप पूर्ण वस्तु समानता तुलना से बच सकते हैं। दोनों वैध बिंदु हैं। मैं अपने बयान के साथ भाग गया है कि "निश्चित रूप से यह हमेशा भूमि के ऊपर नहीं है" और मुझे लगता है कि का जवाब दे रहे था और अनदेखी की है कि आप की तुलना कर रहे थे distinctके साथ distinctBy(और नहीं के साथ to*Set)।
mfulton26

1
@ mfulton26, आप सही हैं। मेरा ज्यादातर मतलब था कि कभी-कभी यह सूची से बेहतर होता है + सेट की तुलना में अलग, क्योंकि सेट का उपयोग तीव्रता से करें / हैशकोड जो संभवतः कॉल करने के लिए महंगा हो सकता है
बकस्टब्यू

1
लेखन के समय, Iterable.distinctवास्तव में toMutableSet().toList()आंतरिक रूप से करता है । तो प्रदर्शन के बारे में चिंता न करें :-)
ल्यूक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.