Есть ли способ добавить пользовательский ввод в массив в Scala, не переопределяя мой старый ввод каждый раз, когда я вызываю функцию? - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь создать список задач в 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, мне снова будет предложено добавить еще один элемент, поэтому при печати после двух входов оба элемента должны печататься.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Список, который вы используете для «хранения» вашего ввода, находится в пределах функции addItem, что неверно. Вы должны переместить list наружу, инициализировать как пустое и затем добавить новый вход в функцию addItem. В текущей реализации вы используете list локально, и каждый раз, когда вы вызываете addItem, вы создаете новый list.

Кроме того, в вашем коде:

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

Вы назначаете массив, инициализированный только одним элементом (input), а затем снова добавляете input к этому новому массиву.

0 голосов
/ 31 октября 2019

Рассмотрите возможность использования простой рекурсивной функции для агрегации массива элементов дел, как показано ниже:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...