2013-04-29 16 views
21

की स्काला अंतर मैं दो सूचियों है:दो सूचियों

val list1 = List("word1","word2","word2","word3","word1") 
val list2 = List("word1","word4") 

मैं list1 से list2 तत्वों की सभी घटनाओं को निकालना चाहते हैं, यानी मैं चाहता हूँ

List("word2","word2","word3") <= list1 *minus* list2 

मैंने किया list1 diff list2 जो मुझे List("word2","word2","word3","word1") देता है जो केवल "शब्द 1" की पहली घटना को हटा रहा है।

मैं इसे सेट में परिवर्तित नहीं कर सकता क्योंकि मुझे डुप्लिकेट के बारे में ज्ञान चाहिए (ऊपर "word2" देखें)। क्या करें?

उत्तर

43

आप

val unwanted = list2.toSet 
list1.filterNot(unwanted) 

list2 में सभी आइटम को हटाने के लिए कर सकते हैं। (आप list2 में डुप्लिकेट के ज्ञान की जरूरत नहीं है।)

+0

बहुत बढ़िया! धन्यवाद –

+0

क्यों 'बुरा'? सेट प्रति बुरा नहीं हैं। –

+2

मुझे लगता है कि उसका मतलब सिर्फ "अवांछित" है - वह आइटम जो आप परिणामस्वरूप सूची में नहीं चाहते हैं। – AmigoNico

6

आप इस कोशिश कर सकते:

val list1 = List("word1","word2","word2","word3","word1") 
val list2 = List("word1","word4") 

println(list1.filterNot(list2.contains(_))) 
+2

सूची 2 पर शामिल ऑपरेशन अक्षम है - यह सूची 1 के प्रत्येक तत्व के लिए एक रैखिक स्कैन करेगा, इसलिए आंतरिक लूप में n x m पुनरावृत्तियों हैं। सेट रोकथाम परीक्षण किसी भी गैर-तुच्छ सेट के लिए सूचियों की तुलना में बेहतर है क्योंकि यह ज्यादातर मामलों को खत्म करने के लिए हैशकोड तुलना का उपयोग करता है और शेष मामलों की छोटी संख्या में स्ट्रिंग समानता का परीक्षण करता है, यदि कोई हो। (यह कितना अच्छा है उपयोग में हैशिंग एल्गोरिदम पर निर्भर करता है)। –

+0

धन्यवाद @ रिक -777। यह समझ आता है। – cmbaxter

+0

सेट अधिक कुशल है, लेकिन ऑर्डर को सुरक्षित नहीं करता है। यदि कोई सेट है जो आदेश को संरक्षित करता है तो मैं इसे अपने मामले – ayvango

संबंधित मुद्दे