web-dev-qa-db-ja.com

標準入力から1行ずつ読み取る方法

Scala標準入力から1行ずつ読み込むためのレシピ?同等のJavaコード:

import Java.util.Scanner; 

public class ScannerTest {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            System.out.println(sc.nextLine());
        }
    }
}
89
Andrei Ciobanu

最も単純な外観のアプローチでは、Predefの一部であるreadLine()を使用します。ただし、最終的なヌル値を確認する必要があるため、かなりいです。

object ScannerTest {
  def main(args: Array[String]) {
    var ok = true
    while (ok) {
      val ln = readLine()
      ok = ln != null
      if (ok) println(ln)
    }
  }
}

これは非常に冗長なので、Java.util.Scanner代わりに。

もっときれいなアプローチではscala.io.Source

object ScannerTest {
  def main(args: Array[String]) {
    for (ln <- io.Source.stdin.getLines) println(ln)
  }
}
130
itemState

コンソールには、Console.readLineを使用できます。あなたは書くことができます(空の行で停止したい場合):

Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))

入力を生成するためにファイルをcatする場合、次を使用してnullまたは空で停止する必要があります。

@inline def defined(line: String) = {
  line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
52
Landei
val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect
27
Jason

再帰バージョン(コンパイラーは、ヒープ使用量を改善するために末尾再帰を検出します)

def read: Unit = {
  val s = scala.io.StdIn.readLine()
  println(s)
  if (s.isEmpty) () else read 
}

Scala 2.11からのio.StdInの使用に注意してください。このアプローチでは、出力に加えて、最終的に返されるコレクションにユーザー入力を蓄積できることに注意してください。

import annotation.tailrec

def read: Seq[String]= {

  @tailrec
  def reread(xs: Seq[String]): Seq[String] = {
    val s = StdIn.readLine()
    println(s)
    if (s.isEmpty()) xs else reread(s +: xs) 
  }

  reread(Seq[String]())
}
10
elm

使用できませんか

var userinput = readInt // for integers
var userinput = readLine 
...

ここで利用可能: Scaladoc API

10
kaning