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

标签 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})

这里有两个问题:
  • 如果我不使用 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上的一个方法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)
    

  • .. 编译器认为您正在尝试添加多个 Int s 到 ListBuffer , 当您尝试添加元组时。您需要一组额外的括号。
     l1.zipWithIndex.slice(0,l1.length-1).foreach(x=> l2 += ((x._1,l1(x._2+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))
    
  • 关于list - Scala:按顺序从列表元素创建元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31800032/

    相关文章:

    c# - 如何在使用多线程时添加到列表?

    javascript - 如何在 JavaScript 中使用 pointfree 风格而不失可读性?

    performance - 为什么函数式语言适合大数据?

    scala - 在 Spark Json 到 Csv 转换中?

    database - 如何将数据库条目加载到我的 Scala 模板中?

    scala - 列表中具有奇数和偶数索引的Zip元素

    java - java中列表列表中的组列表元素

    python - 按函数对python列表进行排序

    java - 使用 JAXB 解码通用列表

    scala - 案例分类和特征