例如,我有 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)
有没有更好/更优雅的选择?
例如,我有 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)
有没有更好/更优雅的选择?
这是另一种方法:
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
s 也是安全的。
尝试理解:
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)
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)
}
也可以使用这个扩展:
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()
}
}