Scala создает список, читает со стандартного ввода, выводит на стандартный вывод

Я пытаюсь прочитать форматированные входные данные из стандартного ввода с помощью Scala:

Эквивалентный код C++ находится здесь:

int main() {
  int t, n, m, p;
  cin >> t;
  for (int i = 0; i < t; ++i) {
    cin >> n >> m >> p;
    vector<Player> players;
    for (int j = 0; j < n; ++j) {
      Player player;
      cin >> player.name >> player.pct >> player.height;
      players.push_back(player);
    }
    vector<Player> ret = Solve(players, n, m, p);
    cout << "Case #" << i + 1 << ": ";
    for (auto &item : ret) cout << item.name << " ";
    cout << endl;
  }
  return 0;
}

Где в коде Scala я хотел бы использовать

players: List[Player], n: Int, m: Int, p: Int

для хранения этих данных.

Может ли кто-нибудь предоставить пример кода?

Или просто дайте мне знать, как:

  1. как работает функция main() в scala
  2. читать форматированный текст со стандартного ввода
  3. эффективное построение списка из входных данных (поскольку список неизменяем, возможно, есть более эффективный способ его создания? вместо того, чтобы иметь новый список по мере поступления каждого элемента?)
  4. вывод форматированного текста в stdout

Спасибо!!!


person JASON    schedule 26.11.2013    source источник
comment
Что касается чтения/анализа двоичных данных, я рекомендую посмотреть здесь: stackoverflow.com/questions/2667714/   -  person dmitry    schedule 26.11.2013
comment
1. и 4. поищите в Google 2. java.util.Scanner 3. в общем, ListBuffer, при условии, что вы используете императивный стиль, который, вероятно, лучше всего подходит для такого рода вещей. В противном случае (поскольку вы пометили это функциональное программирование), вы можете использовать складки или рекурсию. Однако Vector может быть более подходящим, чем List, если вы добавляете.   -  person Luigi Plinge    schedule 26.11.2013


Ответы (1)


Я не знаю С++, но что-то вроде этого должно работать:

def main(args: Array[String]) = {
    val lines = io.Source.stdin.getLines
    val t = lines.next.toInt
    // 1 to t because of ++i
    // 0 until t for i++
    for (i <- 1 to t) {
      // assuming n,m and p are all on the same line
      val Array(n,m,p) = lines.next.split(' ').map(_.toInt)
      // or (0 until n).toList if you prefer
      // not sure about the difference performance-wise
      val players = List.range(0,n).map { j =>
        val Array(name,pct,height) = lines.next.split(' ')
        Player(name, pct.toInt, height.toInt)
      }
      val ret = solve(players,n,m,p)
      print(s"Case #${i+1} : ")
      ret.foreach(player => print(player.name+" "))
      println
    }
  }
person Marth    schedule 26.11.2013
comment
Если вы определяете подкласс Application, вам не нужно определять основной метод, и вы можете кодировать как скрипт прямо в фигурных скобках. - person loloof64; 26.11.2013