Scala - 如何使用两个字符过滤列表

时间:2013-09-25 07:41:33

标签: list scala filter

我有一个char列表是Scala,我想删除所有不是括号的字符。问题是我似乎只能为一个角色做这件事,例如:

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

如果我试试这个:

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

..我没有得到任何东西,因为我过滤了一次,然后第二次删除了一切。如何为多个字符过滤字符列表(不是字符串列表)?

2 个答案:

答案 0 :(得分:8)

如果您需要/想要一个功能性解决方案,请尝试以下方法:

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

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

现在,您可以将您喜欢的任何字符添加到您希望过滤给定列表的秒列表中,而无需更改过滤器调用。如果您想要将acceptedList以外的字符更改为filterNot。这种方法的另一个优点是,你不需要编写大的lambda函数,结合你想过滤的所有字符:x => x == '(' || x == ')' || etc.

更新

与评论中提出的 senia 一样,您也可以使用Set的较短版本,只需将acceptedChars.contains更改为Set个给定的字符:

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

答案 1 :(得分:6)

这将删除所有不是括号的字符:

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

以下是我在scala控制台中测试的内容:

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(_ == ')')应用于此结果将返回空列表。