3

请,对不起我的英语:(让我们通过例子来解释我的问题。我们有一个数组a

    var a = Array(1,1,1,1,2)

我们可以:

  1. 过滤器a

    a.filter( _ < 2 )
    
  2. 计算 a 中的一些元素:

    a.count (_ < 2)
    
  3. 获取集合中的独特元素:

    a.filter { i =>
        a.count(_ == i) == 1
    }
    

问题是:如何在不引入变量 i 的情况下执行第三个子句?是否可以编写类似的内容:

    a.filter ( a.count ( _ == __) == 1 )

我知道我可以写这个(它仍然很短):

    a.filter { i => a.count(_ == i) == 1 }

但我只是对答案感兴趣。

4

2 回答 2

5

如果不引入变量就无法做到这一点,i因为它需要混合来自两个不同范围的变量(称为闭包)。如果我们在不使用_占位符变量的情况下编写它,这会变得更清楚。

a.filter( outer =>
  a.count( inner =>
    outer == inner
  ) == 1
)

对于outerin 的每个值a,我们正在创建一个要传递给的新函数count,其中outer是常量并inner作为参数传入。_只能作为它所在的最里面函数的占位符,因此不能用于替换outer. 这就是为什么

a.filter( outer =>
  a.count(
    outer == _
  ) == 1
)

编译但

a.filter(
  a.count( inner =>
    _ == inner
  ) == 1
)

才不是。

于 2013-11-11T23:02:52.677 回答
0

只是提到一个替代解决方案(我想不是更简单,但更快)

a.groupBy(identity).filter{ case (_, v) => v.size == 1}.keys
于 2013-11-11T23:19:24.757 回答