Scala:按顺序从列表元素创建元组列表

时间:2015-08-04 03:11:04

标签: list scala functional-programming immutability

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

这里有两个问题:

  1. 如果我不使用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)))。那是为什么?
  2. 如果没有可变的listbuffer,怎么办呢?

2 个答案:

答案 0 :(得分:10)

  1. +=ListBuffer l2上接受重复参数的方法。这意味着当你做这样的事情时:

    scala> var l2 = scala.collection.mutable.ListBuffer[(Int, Int)]()
    l2: scala.collection.mutable.ListBuffer[(Int, Int)] = ListBuffer()
    
    scala> l2 += (1, 2)
    <console>:9: error: type mismatch;
     found   : Int(1)
     required: (Int, Int)
                  l2 += (1, 2)
    
  2. ..当您尝试添加元组时,编译器认为您正在尝试向Int添加多个ListBuffer。你需要一套额外的括号。

     l1.zipWithIndex.slice(0,l1.length-1).foreach(x=> l2 += ((x._1,l1(x._2+1)) ))
    
    1. 您可以使用sliding,它将在整个集合中创建一个“滑动窗口”,以返回特定组大小的列表列表,默认步长为1:

      scala> List(0, 3, 6, 12, 14, 15, 16, 17).sliding(2)
                 .map { case List(a, b) => (a, b) }.toList
      res10: List[(Int, Int)] = List((0,3), (3,6), (6,12), (12,14), (14,15), (15,16), (16,17))
      

答案 1 :(得分:3)

除了滑动之外,你可以像下面一样滑动:

  val l1= List(0, 3, 6, 12, 14, 15, 16, 17)
  val l2 = l1.take(l1.size - 1).zip(l1.tail)

更新

   l1.zip(l1.tail) works.