List Scala-如何使用两个字符筛选列表

List Scala-如何使用两个字符筛选列表,list,scala,filter,List,Scala,Filter,我有一个字符列表是Scala,我想删除所有不是括号的字符。问题是我似乎只能为一个角色这样做,例如: var parens = chars.filter(_ == '(') 如果我尝试这样做: var parens = chars.filter(_ == '(').filter(_ == ')') val givenList = List('(', '[', ']', '}', ')') val acceptedChars = List('(', ')') givenList filte

我有一个字符列表是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)

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

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

 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==”)|等。

更新

与注释中建议的senia一样,您也可以使用带有
Set
的较短版本,只需更改函数
acceptedChars。包含带有给定字符集的
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(
应用于此结果将返回空列表。

您也可以使用
筛选器(Set(“(”,“)
,而不是
筛选器(list(“(”,“))。包含)
。它更短。此外:对于大型集合,
filter(largeCollection.toSet)
~O(1)
对于每个过滤元素)比
filter(largeCollection.contains)
O(N)
对于每个过滤元素)。调用
filter(…).filter(…)有问题吗
您需要扫描列表两次吗?