【问题标题】:Scala - how to filter list with two charsScala - 如何用两个字符过滤列表
【发布时间】:2013-09-25 18:20:09
【问题描述】:

我有一个字符列表是 Scala,我想删除所有不是括号的字符。问题是我似乎只能对一个角色执行此操作,例如:

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

如果我试试这个:

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

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

【问题讨论】:

  • 调用filter(...).filter(...)的问题是需要扫描两次列表吗?

标签: list scala filter


【解决方案1】:

如果您需要/想要一个实用的解决方案,那么试试这个:

val givenList = List('(', '[', ']', '}', ')')
val acceptedChars = List('(', ')')

givenList filter acceptedChars.contains // or givenList.filter(acceptedChars.contains)

现在您可以将您喜欢的任何字符添加到要过滤给定列表的秒列表中,而无需更改过滤器调用。如果您想留下不在acceptedList 中的字符,只需更改为filterNot。这种方法的另一个优点是,您不需要编写大的 lambda 函数来组合您想要过滤的所有字符,例如:x => x == '(' || x == ')' || etc.

更新

就像评论中提出的 senia 一样,您也可以使用带有Set 的较短版本,只需使用给定字符的Set 更改函数acceptedChars.contains

givenList.filter(Set('(', ')'))

【讨论】:

  • 您也可以使用filter(Set('(', ')')) 代替filter(List('(', ')').contains)。它更短。
  • 另外:对于大型集合filter(largeCollection.toSet)~O(1) 用于每个过滤的元素)比filter(largeCollection.contains)O(N) 用于每个过滤的元素)更有效。
【解决方案2】:

这将删除所有不是括号的字符:

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(_ == ')') 应用于此结果会返回空列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 2017-05-10
    • 2021-02-09
    • 2016-02-05
    • 2013-09-24
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多