Standart girişten satır satır nasıl okunur?


91

Standart girişten satır satır okumak için Scala tarifi nedir? Eşdeğer java kodu gibi bir şey:

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());
        }
    }
}

Yanıtlar:


130

En yalın bakış açısı, readLine()hangisinin bir parçası olduğunu kullanacaktır Predef. ancak, nihai boş değeri kontrol etmeniz gerektiğinden bu oldukça çirkin:

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

bu çok ayrıntılı, java.util.Scannerbunun yerine kullanmayı tercih edersiniz .

Bence daha güzel bir yaklaşım şunları kullanacaktır scala.io.Source:

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

3
readLine of Predef yöntemi 2.11.0'dan beri kullanımdan kaldırılmıştır, şimdi yönteminscala.io.StdIn
nicolastrres

1
@itemState programım bitmiyor, eğer "io.Source.stdin.getLines" kullanırsam bekleme moduna geçecek ... bunu nasıl halledebilirim ...
Raja

53

Konsol için kullanabilirsiniz Console.readLine. Yazabilirsiniz (boş bir satırda durmak istiyorsanız):

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

Girdiyi oluşturmak için bir dosya seçerseniz, aşağıdakileri kullanarak null veya boşta durmanız gerekebilir:

@inline def defined(line: String) = {
  line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))

Console.readLine () hakkında bilgim var, belirli bir tarifi arıyorum. Standart girdiden satır satır okumak için "ölçekleme" yolu.
Andrei Ciobanu

11
Sanırım şunu demek istiyorsuntakeWhile(_ != null)
Seth Tisue

1
Nasıl durmak istediğine bağlı. Boş bir hat aramak genellikle en basit çözümdür.
Landei

4
Scala 2.11.0 sürümünün Console.readLinekullanımdan kaldırıldığını unutmayın, StdIn.readlinebunun yerine kullanın.
Bartłomiej Szałach

Veya anahtar kelimeden tamamen .takeWhile(Option(_).nonEmpty)kaçınmak istemeniz durumunda daha iyi hissedebilirsiniz null.
conny

27
val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect

6
io.Source.stdin( scala.io.Sourcesınıfta) tanımlanmıştır , def stdin = fromInputStream(System.in)bu nedenle muhtemelen io.Source.stdin.
Nader Ghanbari

Bu Scala 2.12.4 ile çalışmıyor gibi görünüyor veya içe aktarılacak doğru şeyleri bulamadım.
akauppi

Scala 2.12'de çalışır, sadece collectyöntem bu cevabı sicne olarak değiştirir, böylece sadece input.getLinessize bir Iterator. Kullanım durumuna bağlı olarak onu kullanarak .toStreamveya kullanarak gerçekleştirmeye zorlayabilirsiniz .toList.
Nader Ghanbari

11

Özyinelemeli bir sürüm (derleyici, gelişmiş yığın kullanımı için bir kuyruk özyinelemesi algılar),

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

io.StdInScala 2.11'in kullanımına dikkat edin. Ayrıca, bu yaklaşımla, çıktı alınmasının yanı sıra, sonunda döndürülen bir koleksiyonda kullanıcı girdisi biriktirebileceğimizi de unutmayın. Yani,

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

Kullanamaz mısın

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

Burada mevcut olduğu gibi: Scaladoc API


bu döngü ile sunulan koda eşdeğer değildir
techkuz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.