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.