我对Scala非常陌生,因此这个问题可能很幼稚。
我有一个列表,像这样 List[Int] = List(0, 3, 6, 12, 14, 15, 16, 17)
。我想创建一个像这样的列表 [(0,3),(3,6),(6,12)..]
等等。到目前为止,这是我尝试过的:
val l1= List(0, 3, 6, 12, 14, 15, 16, 17)
var l2=scala.collection.mutable.ListBuffer[(Int,Int)]()
l1.zipWithIndex.slice(0,l1.length-1).foreach(x=>{val newval=(x._1,l1(x._2+1)); l2+=newval})
这里有两个问题:
- 如果我不使用
val newval
,也就是尝试执行l1.zipWithIndex.slice(0,l1.length-1).foreach(x=>l2+=(x._1,l1(x._2+1)))
,编译器会报错:<console>:10: error: type mismatch; found : Int required: (Int, Int) l1.zipWithIndex.slice(0,l1.length-1).foreach(x=>l2+=(x._1,l1(x._2+1)))
。为什么会出现这种情况? - 有没有一种方法可以不使用可变的listbuffer来实现它?
l1.init
比l1.take(l1.size - 1)
更符合惯用语。 - Michael ZajacdropRight
的实现是错误的。我基本上是在考虑Stream
的实现。无论如何,整个take
部分是否多余,因为zip
只取共同存在的元素?(即使如此,我同意确保两个列表具有相同长度更易读) - Silly Freakl1.zip(l1.tail)
。 - The Archetypal Paul