0

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

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

如果我试试这个:

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

..我什么也没得到,因为我过滤了一次,然后第二次删除了所有内容。如何过滤多个字符的字符列表(不是字符串列表)?

4

2 回答 2

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.containsSet

givenList.filter(Set('(', ')'))
于 2013-09-25T07:45:15.277 回答
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(_ == ')')此结果将返回空列表。

于 2013-09-25T07:49:00.253 回答