2013-09-25 80 views
0

我有一個字符清單是斯卡拉我想刪除所有不是括號的字符。問題是,我似乎只是能夠爲一個字符做到這一點,如:斯卡拉 - 如何篩選兩個字符的列表

var parens = chars.filter(_ == '(') 

如果我試試這個:

var parens = chars.filter(_ == '(').filter(_ == ')') 

..我什麼也沒得到,因爲我一次過濾,然後第二次消除了一切。如何過濾多個字符的字符列表(不是字符串列表)?

+0

調用'filter(...).filter(...)'是否需要掃描列表兩次? –

回答

8

如果您需要/想一個實用的解決方案,然後嘗試這個辦法:

val givenList = List('(', '[', ']', '}', ')') 
val acceptedChars = List('(', ')') 

givenList filter acceptedChars.contains // or givenList.filter(acceptedChars.contains) 

現在你可以添加任何字符,你喜歡上你想過濾列表給出不改變過濾器調用列表秒。如果您想離開不在acceptedList中的字符,請更改爲filterNot。這個形式給出的另一個優點是,你不需要寫大lambda函數結合所有的字符上,你想過濾器,如:在註釋中,你可以提出x => x == '(' || x == ')' || etc.

更新

塞尼亞還可以使用更短的版本Set只是改變功能acceptedChars.contains給定字符的Set

givenList.filter(Set('(', ')')) 
+3

你也可以使用'filter(Set('(',')'))'而不是'filter(List('(',')')。contains)'。它更短。 – senia

+1

另外:對於大集合'filter(largeCollection.toSet)'('〜O(1)'爲每個過濾元素)比'filter(largeCollection.contains)'('O(N)'更有效每個過濾元件)。 – senia

6

這將刪除不相提並論的所有字符附着點:

val parens = chars.filter(c=>c=='('||c==')') 

以下是我在斯卡拉控制檯測試:

scala> val chars = List('a', 'b', '(', 'c', ')', ')') 
chars: List[Char] = List(a, b, (, c,),)) 

scala> val parens = chars.filter(c=>c=='('||c==')') 
parens: List[Char] = List((,),)) 

你的代碼去除一切的原因是...第一濾波器(chars.filter(_ == '('))移除所有人物不是(,這意味着只剩下(。對此結果應用filter(_ == ')')將返回空列表。