我有一个列表可能包含某些连续相同的元素。我想用一个替换许多连续的相同元素。如何在scala中执行此操作
让我们说清单是
List(5, 7,2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
我希望输出列表为
List(5,7,2,3 5, 3,2)
答案 0 :(得分:6)
使用sliding
:
myList.head :: myList.sliding(2).collect { case Seq(a,b) if a != b => b }.toList
它会查看所有对,并且对于每个不匹配的对(a,b)
,它会返回b
。但是它必须将原始a
粘贴在列表的前面。
答案 1 :(得分:4)
我确信有更好的方法。
list.tail.foldLeft(List[Int](list.head))((prev, next) => {
if (prev.last != next) prev +: next
else prev
})
foldLeft
接受一个参数(在第一个应用程序中)并从左到右穿过列表,将prev
和next
应用于给定的两个参数函数,其中{到目前为止,{1}}是函数的结果,prev
是列表中的下一个元素。
next
通常,list.zipWithIndex.filter(l => (l._2 == 0) || (l._1 != list(l._2-1))).map(_._1)
返回相应元素的元组列表。例如list.zip(otherList)
将导致List(1,2,3).zip(List(4,5,6))
。 List((1,4), (2,5), (3,6))
是一个特定的函数,它将每个列表元素与其索引相关联,从而生成一个列表,其中每个元素的格式为zipWithIndex
。
(original_list_element, index)
返回一个列表,其中只包含list.filter(function_returning_boolean)
true
返回的元素。我给出的函数只是检查这个元素是否等于原始列表中的前一个元素(或者索引是0)。
最后一部分function_returning_boolean
只删除索引。
答案 2 :(得分:1)
val myList = List(5, 7, 2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
// > myList : List[Int] = List(5, 7, 2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
myList.foldRight(List[Int]())((i: Int, right: List[Int]) => {
if (right.isEmpty || right.head != i)
i::right
else
right
}); // > res0: List[Int] = List(5, 7, 2, 3, 5, 3, 2)
答案 3 :(得分:1)
val l = List(5, 7,2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
def f(l: List[Int]): List[Int] = l match {
case Nil => Nil
case x :: y :: tail if x == y => f(y::tail)
case x :: tail => x :: f(tail)
}
println(f(l)) //List(5, 7, 2, 3, 5, 3, 2)
当然你可以让它尾递归
答案 4 :(得分:1)
(答案从this duplicate移出)
这是一个变种
代码:
def compress[A](xs: List[A]): List[A] = {
@annotation.tailrec
def rec(rest: List[A], stack: List[A]): List[A] = {
(rest, stack) match {
case (Nil, s) => s
case (h :: t, Nil) => rec(t, List(h))
case (h :: t, a :: b) =>
if (h == a) rec(t, stack)
else rec(t, h :: stack)
}
}
rec(xs, Nil).reverse
}
示例
println(compress(List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)))
产生以下输出:
List('a, 'b, 'c, 'a, 'd, 'e)
答案 5 :(得分:0)
试试这个,
val y = list.sliding(2).toList
val x =y.filter(x=> (x.head != x.tail.head)).map(_.head) :+ (y.reverse.filter(x=> x.head !=x.tail.head)).head.tail.head
答案 6 :(得分:0)
另一种变体
val is = List(5, 7,2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
val ps = is.head::((is zip is.tail) collect { case (a,b) if a != b => b })
//> ps : List[Int] = List(5, 7, 2, 3, 5, 3, 2)
(is zip is.tail
正在执行类似于.sliding(2)
)
答案 7 :(得分:0)
import scala.collection.mutable.ListBuffer
object HelloWorld {
def main(args:Array[String]) {
val lst=List(5, 7, 2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)
val lstBf=ListBuffer[Int](lst.head)
for(i<-0 to lst.length-2){
if(lst(i)!=lst(i+1)){
lstBf+=lst(i+1)
}
}
println(lstBf.toList)
}
}