Scala:连接两个不可变列表

时间:2015-09-18 13:32:10

标签: list scala concatenation immutability

我试图找出如何使用尾递归返回用户输入的List,然后将此“临时列表”添加到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)

2 个答案:

答案 0 :(得分:1)

我可能错了,我自己没有尝试过,但我猜想public void operation(OpInput opInput)永远没有机会返回确定的清单。

当您说“停止”时,请在返回addToList值之前致电exerciseSelector()

此外,acc的结果似乎在某处丢失了。它应该作为finalListAdd的参数给出,以便能够打印。

你可以试试吗?

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()个自我。 finalList作为exerciseSelector()的参数给出。第一次调用时给出的默认值。

答案 1 :(得分:1)

首先

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'案例是多余的。

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

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

只有'停止'它才会退出。