【问题标题】:Scala appending ListScala附加列表
【发布时间】:2020-08-21 16:30:39
【问题描述】:

我开始进入 Scala 进行作业,并且我一直在寻找如何将项目添加到列表中大约一个小时。我当然找到了几种解决方案,下面的代码可以编译,但生成的列表只是空的。谁能告诉我这是为什么?

  case NodeList(ls) => {
      var ls0 = List()
      ls.foreach {
        println("hey") // => printed 3 times
        i => ls0 :+ i
      }

      println(ls0) // => Empty list as output (ls contains 3 items when called)
  }

非常感谢您的帮助!提前致谢。

【问题讨论】:

  • List 以及 Scala 中的大多数东西都是不可变的。 ls0 :+ i 生成一个新列表,将值添加到列表末尾,然后丢弃结果;最后ls0 仍然是一个空列表。 - 顺便说一句,在列表末尾添加元素非常慢。
  • 谢谢!那么在这里正确执行此操作的方法是什么? (顺便说一句,我需要对另一个列表进行迭代,原因未在代码中显示)
  • 实际上有很多方法,这取决于您的最终目标。你可以只写一个 (tail) 递归算法。您可以使用 var 而不是 val 并不断改变引用。你甚至可以用map 替换原来的List。随着您继续作业,您将学习所有这些方式,我建议您再看一下您的笔记或使用其他学习材料,那里有很多书籍/博客/课程/视频。
  • 非常感谢您的回答,非常感谢!祝你有美好的一天!

标签: list scala append add


【解决方案1】:

您正在将一个项目附加到列表中,但您从未存储生成的新列表。基本上,您追加一个项目,然后丢弃结果,再次追加,再次丢弃,依此类推。

您需要将列表存储在某处。

请注意,追加到列表是一个坏主意:您必须遍历整个列表才能找到最后一个元素,然后下次追加时,您必须一遍又一遍地重复。这意味着您的代码具有 (n^2 - n)/2 的算法复杂度,而在 Θ(n) 中可以轻松完成相同的操作。您应该始终添加到列表中,切勿追加。

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2017-06-23
    • 2020-09-02
    • 2014-06-10
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2018-12-09
    相关资源
    最近更新 更多