List Scala-如何使用两个字符筛选列表
我有一个字符列表是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
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(…)有问题吗
您需要扫描列表两次吗?