我有一个char列表是Scala,我想删除所有不是括号的字符。问题是我似乎只能为一个角色做这件事,例如:
var parens = chars.filter(_ == '(')
如果我试试这个:
var parens = chars.filter(_ == '(').filter(_ == ')')
..我没有得到任何东西,因为我过滤了一次,然后第二次删除了一切。如何为多个字符过滤字符列表(不是字符串列表)?
答案 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(_ == ')')
应用于此结果将返回空列表。