迭代列表,返回当前,下一个和当前之前的元素

Mal*_*lax 11 iteration scala tuples list

我在以scala-esque和优雅的方式编写特定应用程序时遇到问题.我现在尝试了一段时间,但我找不到这个问题的"好"解决方案:

鉴于我有以下列表:

List("foo", "bar", "baz", "blah")
Run Code Online (Sandbox Code Playgroud)

我想迭代这个列表,不仅给出了每个迭代的当前元素,还给出了当前元素之前和之后的元素.这可能是一个Tuple3但不是必需的.这可能是元组签名:

(Option[T], T, Option[T])
Run Code Online (Sandbox Code Playgroud)

为了澄清我的意思,这是针对a的每次迭代的建议元组List[String],在第四次之后结束.

迭代1: (None, "foo", Some("bar"))

迭代2: (Some("foo"), "bar", Some("baz"))

迭代3: (Some("bar"), "baz", Some("blah"))

迭代4: (Some("baz"), "blah", None)

我怎么能达到这样的结果?再说一遍:我不受Tuple3的约束,任何其他解决方案也非常感谢!

谢谢!

ret*_*nym 16

这是一种方法.它使用新的Scala 2.8集合方法sliding.

def window[A](l: List[A]): Iterator[List[Option[A]]] = 
   (None :: l.map(Some(_)) ::: List(None)) sliding 3

window(List(1, 2, 3, 4, 5)).toList

// List(List(None, Some(1), Some(2)), List(Some(1), Some(2), Some(3)), List(Some(2), Some(3), Some(4)), List(Some(3), Some(4), Some(5)), List(Some(4), Some(5), None))
Run Code Online (Sandbox Code Playgroud)

更新:这是一个适用于Streams的版本.

def windowS[A](s: Stream[A]): Stream[List[Option[A]]] = 
  (None #:: s.map(Some(_): Option[A]) #::: Stream(None: Option[A])).sliding(3).toStream.map(_.toList)  

val posInts = Stream.range(1, Integer.MAX_VALUE)
windowS(posInts).take(5).toList
Run Code Online (Sandbox Code Playgroud)