2013-09-25 51 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(_ == ')')将返回空列表。