11

例如,我有 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

4 回答 4

9

这是另一种方法:

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)
}

这对空Seqs 也是安全的。

于 2012-11-04T00:25:15.060 回答
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)
于 2012-11-03T21:00:11.803 回答
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)
}
于 2020-07-09T06:45:56.270 回答
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()
  }

}
于 2021-04-27T08:14:22.330 回答