【问题标题】:Scala iterate over two consecutive elements of a listScala迭代列表的两个连续元素
【发布时间】:2020-04-22 17:52:34
【问题描述】:

我们将如何迭代列表的两个连续元素并应用差异函数 例如我有这个:

val list = List(List("Eat", "Drink", "Sleep", "work"), List("Eat", "Sleep", "Dance"))

我想遍历这两个连续的元素并计算差异

我试过了,但我不知道如何遍历每两个连续的元素

list.map((a,b) => a.diff(b))

输出应该是List("Drink", "work")

【问题讨论】:

  • 你想为这些输入获得什么输出?
  • 我已经用所需的输出编辑了问题
  • 如果输入包含两个以上的列表,那么您希望发生什么?还是输入列表的长度总是为 2?
  • 对我来说这也不像是“联合”吗? “联合功能”在哪里进入?
  • 如果列表包含多个,它应该遍历所有可能的对。这两个元素只是为了说明

标签: list scala iteration pairwise


【解决方案1】:

如果我理解正确,您可能想要遍历滑动窗口。

list.sliding(2).map{
  case List(a, b) => a.diff(b)
  case List(a) => a
}.toList

或者,您可能还需要grouped(2),它将列表划分为组。

【讨论】:

  • 滑动窗口是否解析列表中每​​个元素的所有可能组合?还是只是计算每两个连续元素的差异
  • @MunaAr 为什么不直接检查scaladoc?而不是问?
  • 每两个连续元素。
【解决方案2】:
def main(args: Array[String]): Unit = {
    val list = List(List("Eat", "Drink", "Sleep", "work"), List("Eat", "Sleep", "Dance"));
    val diff = list.head.diff(list(1))
    println(diff)
  }

【讨论】:

    【解决方案3】:

    在你的情况下,匹配可以很好地工作:

    val list = List(List("Eat", "Drink", "Sleep", "work"), List("Eat", "Sleep", "Dance"))
    list match { case a :: b :: Nil => a diff b}
    

    如果列表并不总是有 2 个项目,您还应该在匹配中包含一个包罗万象的大小写

    【讨论】:

    • 这给出了一些警告,但我确实得到了你想要做的事情谢谢