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)
| 归档时间: |
|
| 查看次数: |
6221 次 |
| 最近记录: |