【问题标题】:How can I make a list of tuples in scala in a function?如何在函数中的 scala 中创建元组列表?
【发布时间】:2020-07-25 18:13:18
【问题描述】:

我正在尝试在递归函数中创建一个充满元组的列表,以便列表在迭代时变得更大。我只是不知道如何在 scala 中实现这一点。

def tryToClaimPosition(player: Int, horizontal: Int , vertical: Int , list: List[(Int, Int)]): Unit = {
if (vertical == gridsize - 1) {
  println(list);
}
if (horizontal < gridsize - 1) {
  if (gameBoard(horizontal)(vertical) == player) {
    val tuple = (horizontal,vertical)
    val list2 = list :: tuple
    tryToClaimPosition(player, horizontal + 1, vertical, list2)
  else {
    tryToClaimPosition(player, horizontal + 1, vertical, list)
  }
}

正如你在上面的 sn-p 中看到的,我有一个元组列表,我有一个元组,但我无法添加它。

【问题讨论】:

  • horizontal &gt; gridsize - 1 时会发生什么?

标签: list scala functional-programming tuples scala-collections


【解决方案1】:

我会改用不可变列表,那将是一个累加器。这将是一种更实用的方式。该函数不会产生副作用,并会返回结果List

def tryToClaimPosition(player: Int, horizontal: Int , vertical: Int , list: List[(Int, Int)]): List[(Int, Int)] = {
  if (vertical == gridsize - 1) {
    list.reverse
  }
  if (horizontal < gridsize - 1) {
    if (gameBoard(horizontal)(vertical) == player) {
      val tuple = (horizontal, vertical)
      tryToClaimPosition(player,horizontal + 1, vertical, tuple::list)
    else {
      tryToClaimPosition(player,horizontal + 1, vertical, list)
    }
  } else Nil
}

请注意,我已将元组添加到列表中,因为它需要恒定的时间(添加与List 的大小成正比)。这就是我返回list.reverse 的原因,以便保持原始顺序。

我还问了horizontal &gt; gridsize - 1时的情况。你的程序什么都不做,所以我假设什么都不应该返回,因此Nilelse 子句中。它是必需的,以便函数始终返回一个值。

【讨论】:

    【解决方案2】:

    您的代码有许多明显的逻辑和语法错误。与您的问题最相关的是list :: tuple 无法编译,因为:: 方法的右侧 侧必须是List

    使用::List 前置,而不是附加到List

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 2015-10-26
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      相关资源
      最近更新 更多