我是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))
答案 0 :(得分:1)
我会采取不同的方法:
首先将它们分组是个好主意。然后你可以得到每个小组的负责人:
seq.groupBy{
case (x, _) => x
}.map {
case (_, head :: _) => head
}.toList
答案 1 :(得分:0)
prev
中的{p> prev = tuple._1
是与val prev = -1
完全不同的变量!请注意,即使第一个prev
为val
,它也会编译,即不可变(无法更改)。
如果您想使用此方法,您可以:
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;将保留在地图中。