对于多个生成器来处理Seq

时间:2015-04-25 08:24:23

标签: scala

我是scala的新手,我希望第一个组件的Seq [(Int,Int)]是唯一的,我的代码如下:

val seq = Seq((1,1), (0,1), (2,1), (0, 1), (3,1), (2,1))
val prev = -1
val uniqueSeq = for(tuple <- seq.sortBy(_._1) if !tuple._1.equals(prev); prev = tuple._1) yield tuple

但为什么结果是

uniqueSeq: Seq[(Int, Int)] = List((0,1), (0,1), (1,1), (2,1), (2,1), (3,1))

3 个答案:

答案 0 :(得分:1)

我会采取不同的方法:

首先将它们分组是个好主意。然后你可以得到每个小组的负责人:

seq.groupBy{
  case (x, _) => x
}.map {
  case (_, head :: _) => head
}.toList

答案 1 :(得分:0)

prev中的{p> prev = tuple._1是与val prev = -1完全不同的变量!请注意,即使第一个prevval,它也会编译,即不可变(无法更改)。

如果您想使用此方法,您可以:

val seq = Seq((1,1), (0,1), (2,1), (0, 1), (3,1), (2,1))
var prev = -1
val uniqueSeq = for(tuple <- seq.sortBy(_._1) if !tuple._1.equals(prev)) yield { prev = tuple._1; tuple }

但它不是Scala中的惯用语。我会把它留给别人,因为我现在没有足够的时间。

答案 2 :(得分:0)

Alexey已经解释了您使用prev变量所犯的错误。 对你正在尝试做的事情(如果我做对了)的更惯用的实现是

val seq = Seq((1,1), (0,1), (2,1), (0, 1), (3,1), (2,1))
seq.sortBy(_._1).reverse.toMap.toList // List((0,1), (1,1), (2,1), (3,1))

需要注意的是,通过Map复制键将会消失。 reverse是必要的,因为最后一次出现&#34;键&#34;将保留在地图中。