List Scala:连接两个不可变列表

List Scala:连接两个不可变列表,list,scala,concatenation,immutability,List,Scala,Concatenation,Immutability,我试图弄清楚如何使用尾部递归获得一个包含用户输入的列表,然后将这个“临时列表”添加到finalList中,并一次又一次地重试,但出于某种原因,我无法弄清楚为什么我的代码不起作用 编辑:这是对工作示例解决方案的更新 val finalList = List[String]() def exerciseSelector(finalList: List[String]) { val user = scala.io.StdIn.readLine("choose:") user

我试图弄清楚如何使用尾部递归获得一个包含用户输入的列表,然后将这个“临时列表”添加到finalList中,并一次又一次地重试,但出于某种原因,我无法弄清楚为什么我的代码不起作用

编辑:这是对工作示例解决方案的更新

  val finalList = List[String]()


  def exerciseSelector(finalList: List[String]) {
    val user = scala.io.StdIn.readLine("choose:")
    user match {
      case "add" =>  exerciseSelector(finalListAdd(finalList,addToList(List[String]())))
      case "print" => println(finalList) ; exerciseSelector(finalList)
      case "stop" => sys.exit()
    }
  }

  def addToList(acc: List[String]): List[String] = {
    val input = scala.io.StdIn.readLine("input:")
    input match {
      case "stop" => acc
      case input: String => addToList(input :: acc)

    }}

def finalListAdd(acc: List[String], list: List[String]): List[String] =  list match{
    case Nil => acc
    case h :: t => finalListAdd(h :: acc, t)
  }

exerciseSelector(finalList)

我可能错了,我自己没有试过,但我猜,
addToList
从来没有机会返回累计列表

当你说“停止”时,你调用
exerciseSelector()
,然后返回
acc

而且,
finallistad
的结果似乎在某个地方丢失了。它可能应该作为
exerciseSelector()
的参数提供,以便能够打印

你能试试吗

 def exerciseSelector(finalList: List[String]) {
    val user = scala.io.StdIn.readLine("choose:")
    user match {
      case "add" =>  exerciseSelector(finalListAdd(finalList,addToList(List[String]())))
      case "print" => println(finalList)
      case "stop" => sys.exit()
    }
  }

  def addToList(acc: List[String]): List[String] = {
    val input = scala.io.StdIn.readLine("input:")
    input match {
      case "stop" => acc
      case input: String => addToList(input :: acc)

    }}

def finalListAdd(acc: List[String], list: List[String]): List[String] =  list match{
    case Nil => acc
    case h :: t => finalListAdd(h :: acc, t)
  }

exerciseSelector(List[String]())
正在更改的
exerciseSelector()
已上移到其
exerciseSelector()
self。 finalList作为
exerciseSelector()
的参数给出。第一次调用时给定的默认值。

首先

val tempList = List[String]()
val finalList = List[String]()
没有必要,因为您无法真正添加到这些列表中,它们都是不可变的和最终的VAL

finalList
返回一个
List[String]
,据我所知,它应该是您要打印的列表

但是,

case "add" => finalListAdd(finalList,addToList(tempList)) 
从未在任何地方使用过

我不确定具体的要求,但实际上我相信你的代码可以减少到

  @tailrec
  def exerciseSelector(currentList: List[String]): Unit = {
    val user = scala.io.StdIn.readLine("choose:")
    user match {
      case "stop" => sys.exit()
      case "print" =>
        println(currentList)
        exerciseSelector(currentList)
      case "add" => exerciseSelector(currentList)
      case input: String => exerciseSelector(input :: currentList)
    }
  }

  exerciseSelector(List.empty)
在这里,“add”案例是多余的

代码将向列表中添加任何不匹配的字符串

在“打印”时,它将打印出当前列表


只有在“停止”时,它才会退出

你能告诉我们什么不起作用吗?(异常或日志结果会很好)问题是,如果我在列表中“添加”内容,它似乎工作得很好,只要我输入“停止”返回到exerciseSelector(),然后尝试打印finalList,它就会打印出一个空列表。嗯,是的,这也是我对代码的想法,他不能把名单还给我。。。我会查出来的,谢谢!编辑:我只是尝试了一下,但这不起作用,因为它是递归的,需要一个结果类型。。。但是无论如何,我试着只运行addToList,并在返回acc之前添加了一个println,在它为Null的情况下,它工作得很好,所以这不是问题,这段代码也不工作,因为exerciseSelector()也需要一个结果类型,在这里,exerciseSelector函数没有声明结果类型!!编辑:我刚刚用一个返回值调整了函数exerciseSelector,现在它可以工作了,但是当你第一次尝试调用“add”案例时,finallist会被覆盖,这不应该是因为我认为
exerciseSelector
必须返回任何东西<代码>最终列表打印在内部。(是的,我可以删除签名中的
=
)您介意将更新的代码放在某个地方吗?谢谢您的解决方案!你的方式也很有趣。我没有任何具体的要求,我只是想弄清楚如何在列表中添加一些内容,同时做一些不同的事情,比如打印出来,然后再在列表中添加一些内容,而不丢失先前添加到列表中的内容,也不使用可变列表!