删除scala中的连续相同元素

时间:2015-03-30 05:40:58

标签: scala

我有一个列表可能包含某些连续相同的元素。我想用一个替换许多连续的相同元素。如何在scala中执行此操作

让我们说清单是

List(5, 7,2, 3, 3, 3, 5, 5, 3, 3, 2, 2, 2)

我希望输出列表为

List(5,7,2,3 5, 3,2)

8 个答案:

答案 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接受一个参数(在第一个应用程序中)并从左到右穿过列表,将prevnext应用于给定的两个参数函数,其中{到目前为止,{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)
}

}