在Seq的每两个相邻元素之间插入一个元素

时间:2012-11-03 20:54:47

标签: scala

例如,我有Seq(1,2,3),我想获得Seq(1,0,2,0,3)

首先想到的是:

  scala> Seq(1,2,3).flatMap(e => 0 :: e :: Nil).tail
  res17: Seq[Int] = List(1, 0, 2, 0, 3)

有更好/更优雅的选择吗?

4 个答案:

答案 0 :(得分:8)

尝试理解:

for(i <- list; p <- List(0, i)) yield p

但是你必须以某种方式删除第一个元素(它产生:0,1,0,2,0,3),或者通过:

(for(i <- list; p <- List(0, i)) yield p).tail

或:

list.head :: (for(i <- list.tail; p <- List(0, i)) yield p)

答案 1 :(得分:6)

这是另一种方法:

def intersperse[E](x: E, xs:Seq[E]): Seq[E] = (x, xs) match {
    case (_, Nil)     => Nil
    case (_, Seq(x))  => Seq(x) 
    case (sep, y::ys) => y+:sep+:intersperse(sep, ys)
}

对空Seq也是安全的。

答案 2 :(得分:0)

def intersperse[T](xs: List[T], item: T): List[T] = xs match {
  case Nil => xs
  case _ :: Nil => xs
  case a :: ys => a :: item :: intersperse(ys, item)
}

答案 3 :(得分:0)

也可以使用这个扩展:

implicit class SeqExtensions[A](val as: Seq[A]) extends AnyVal {

  def intersperse(a: A): Seq[A] = {
    val b = Seq.newBuilder[A]
    val it = as.iterator

    if (it.hasNext) {
      b += it.next()
      while(it.hasNext) {
        b += a
        b += it.next()
      }
    }

    b.result()
  }

}