我有一个字符列表是 Scala,我想删除所有不是括号的字符。问题是我似乎只能为一个角色做到这一点,例如:
var parens = chars.filter(_ == '(')
如果我试试这个:
var parens = chars.filter(_ == '(').filter(_ == ')')
..我什么也没得到,因为我过滤了一次,然后第二次删除了所有内容。如何过滤多个字符的字符列表(不是字符串列表)?
如果您需要/想要功能性解决方案,请尝试以下操作:
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('(', ')'))
这将删除所有不是括号的字符:
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(_ == ')')
此结果将返回空列表。