是否有一种方法可以将用户输入附加到Scala中的数组,而不会在每次调用该函数时都覆盖我的旧输入?

问题描述 投票:0回答:2

我正在尝试在Scala中构建待办事项列表,而我的addItem函数遇到了麻烦。我希望它能够创建一个字符串数组来存储用户的输入,但是现在,用户输入每次都将被覆盖,而不是保存旧的输入。

def addItem() = {

    val input = scala.io.StdIn.readLine()
    var list = Array[String](input) :+ input
    list.foreach(println)
}

我希望此代码可以打印自编译以来输入的每个用户输入,但是,它只会打印最近的输入2次。

我制作了这个菜单和主要功能,该功能调用了我想使用的功能。

def menu(option: Int): Boolean = {
  option match {
    case 1 =>
      addItem()
      true
    case 2 =>
      println("Enter item to delete")
      true
    case 3 =>
      println("Here is your todo list")
      false
    case 4 =>
      println("selected quit")
      false
    case _ => // the else case
      println("Unrecognized command")
      true
  }
}
}

每次我按数字1时,我都希望能够将一个项目添加到列表中,并使该项目与以前添加的项目一起存储。到目前为止,我不知道该如何存储多个值。我的目标是能够添加每次要存储的项目,而不会覆盖以前存储的项目。

我应该按1,提示添加一个项目,然后输入该项目并将其存储。如果再次按1,则将再次提示我添加另一个项目,因此当在两个输入之后打印该项目时,两个项目都应打印。

arrays scala append
2个回答
0
投票

考虑使用简单的递归函数来汇总待办事项数组,如下所示:

def inputToDo(quit: String): Array[String] = {
  @scala.annotation.tailrec
  def loop(acc: Array[String]): Array[String] =
    scala.io.StdIn.readLine match {
      case x if x == quit => acc
      case x => loop(acc :+ x)
    }
  loop(Array.empty[String])
}

val toDoList = inputToDo("q")
// grocery
// laundry
// q
// toDoList: Array[String] = Array(grocery, laundry)

0
投票

您用于“存储”输入的列表在addItem函数中,这是不正确的。您应该将list移到外面,初始化为空,然后将新输入追加到函数addItem中。在当前的实现中,您以本地方式使用list,每次调用addItem都会创建一个新的list

另外,在您的代码中:

var list = Array[String](input) :+ input

您正在分配一个仅用一项(input)初始化的数组,然后,您再次将input追加到该新数组。

© www.soinside.com 2019 - 2024. All rights reserved.