2017-06-21 15 views
5

जावा में मैं इस कोड के साथ एक सूची से आइटम निकाल सकते हैं:कोटलिन के साथ एक सूची में फ़िल्टर कैसे फ़िल्टर करें?

private void filterList(List<Item> items) { 
    Iterator<Item> iterator = items.iterator(); 
    while (iterator.hasNext()) { 
     if (checkItem(iterator.next())) { 
      iterator.remove(); 
     } 
    } 
} 

कैसे (अर्थात फिर से निर्माण के बिना एक List में कुछ आइटम निकालें) Kotlin में एक ही बनाने के लिए?

+0

क्यों एंड्रॉयड टैग के साथ आगे बढ़ना चाहते हैं तो क्या होगा? – user7294900

+3

बस इस कोड को कोटलिन फ़ाइल में कॉपी करें, आईडीई स्वचालित रूप से आपके लिए यह करता है। – chandil03

उत्तर

12

बस .retainAll { ... } या .removeAll { ... }, दोनों एक विधेय को स्वीकार करने, यथा-स्थान यह फिल्टर करने के लिए उपयोग करें:

items.retainAll { shouldRetain(it) } 

items.removeAll { shouldRemove(it) } 

ध्यान दें कि items कि के लिए एक MutableList<T> ही नहीं, List<T> होना चाहिए , जो कोटलिन में केवल पढ़ने योग्य सूची है और इस प्रकार किसी भी उत्परिवर्तनीय कार्यों का खुलासा नहीं करता है (देखें: Collections भाषा संदर्भ में)।

वैसे, इन दोनों समारोह सूचियों कि रैंडम एक्सेस का समर्थन के लिए कुशलता से लागू किया जाता है: फिर सूची के बाद प्रत्येक आइटम (O (n) समय बुरी से बुरी हालत) निकाल दिया जाता है जमा नहीं है, और इसके बजाय वस्तुओं को संसाधित किया जाता है क्योंकि इसे संसाधित किया जाता है, ओ (एन) समय दे रहा है।


और अगर आप मूल सूची को संशोधित नहीं करना चाहते हैं, तो आप केवल आइटम आप .filter { ... } या .filterNot { ... } का उपयोग कर बनाए रखना चाहते के साथ एक अलग संग्रह उत्पादन कर सकते हैं, इस के लिए केवल पढ़ने के लिए List<T> रूप में अच्छी तरह से काम करेगा :

val filtered = items.filter { shouldRetain(it) } 

val filtered = items.filterNot { shouldRemove(it) } 
+1

अगर मैं इसके लिए कोई फ़ंक्शन नहीं था तो मैं डर गया होता। मानक पुस्तकालय अद्भुत है। – zsmb13

+1

क्या आपका मतलब 'निकालें' होगा? क्योंकि प्रश्न में जब * अनुमान * पास होता है तो एक आइटम हटा दिया जाता है। – Ilya

+0

@ इलिया, धन्यवाद, यह सिर्फ 'चेकइटम' नाम है जो मुझे भ्रमित कर रहा है। फिक्स्ड। – hotkey

2

Kotlin साफ बिल्ट-इन कार्य का एक बहुत है। आप यहां filter का उपयोग करने का प्रयास कर सकते हैं।

val filteredItems = items.filter { checkItem(it) } 

दुर्भाग्यवश, यह सूची को फिर से बनाएगा। यह एपीआई अतिरिक्त उत्परिवर्तन से बचने के उद्देश्य से डिजाइन किया गया था।

लेकिन आप अभी भी एक MutableList उपयोग retainAll विधि

items.retainAll { checkItem(it) } 
संबंधित मुद्दे