मानक इनपुट लाइन से लाइन द्वारा कैसे पढ़ें?


90

मानक इनपुट से लाइन द्वारा पढ़ने के लिए स्केल नुस्खा क्या है? समतुल्य जावा कोड जैसा कुछ:

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

जवाबों:


130

सबसे सीधा दिखने वाला दृष्टिकोण बस का उपयोग करेगा readLine()जो का हिस्सा है Predef। हालाँकि यह उतना ही बदसूरत है जितना आपको अंततः शून्य मान की जाँच करने की आवश्यकता है:

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

3
2.11.0 के बाद से पूर्वनिर्धारित विधि का पाठ हटा दिया गया था, अब यह विधि का उपयोग करने की सिफारिश की गई हैscala.io.StdIn
निकोलस्ट्रेस

1
@itemState मेरा कार्यक्रम समाप्त नहीं हो रहा है, अगर मैं उपयोग करता हूं, "io.Source.stdin.getLines" प्रतीक्षा मोड में जा रहा है ... यह कैसे संभालता है ...
राजा

53

कंसोल के लिए आप उपयोग कर सकते हैं Console.readLine। आप लिख सकते हैं (यदि आप खाली रेखा पर रुकना चाहते हैं):

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

यदि आप इनपुट उत्पन्न करने के लिए एक फ़ाइल कैट करते हैं, तो आपको उपयोग करके रिक्त या रिक्त होने की आवश्यकता हो सकती है:

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

मैं Console.readLine () के बारे में जानता हूं, मैं एक दिए गए नुस्खा की तलाश में हूं। स्टैंडर्ड इनपुट से लाइन द्वारा रीडिंग लाइन के लिए "स्काला" तरीका।
आंद्रेई सिओबानु

11
मुझे लगता है कि आपका मतलब हैtakeWhile(_ != null)
सेठ टिस्यू

1
निर्भर करता है कि आप कैसे रोकना चाहते हैं। एक खाली लाइन की तलाश में अक्सर सबसे सरल समाधान होता है।
लैंडेई

4
ध्यान दें कि स्केल 2.11.0 Console.readLineसे पदावनत किया जाता है, StdIn.readlineइसके बजाय उपयोग करें ।
बार्टोलोमिएज सज़ाचैक

या .takeWhile(Option(_).nonEmpty)यदि आप nullकीवर्ड से पूरी तरह बचना चाहते हैं, तो आप बेहतर महसूस कर सकते हैं ।
शंकु

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

6
io.Source.stdinपरिभाषित किया गया है ( scala.io.Sourceकक्षा में) क्योंकि def stdin = fromInputStream(System.in)शायद इसके साथ रहना बेहतर है io.Source.stdin
नादेर घनबरी

यह स्कैला 2.12.4 के साथ काम नहीं करता है, या मुझे आयात करने के लिए सही चीजें नहीं मिलीं।
एकुप्पी

यह स्कैला 2.12 में काम करता है, बस इस collectपद्धति को इस उत्तर को बदल दिया जाता है ताकि आपको केवल कॉल करना पड़े input.getLinesजो आपको ए Iterator। आप इसे उपयोग करने के लिए .toStreamया .toListउस पर जोर देने के लिए मजबूर कर सकते हैं , उपयोग के मामले पर निर्भर करता है।
नादेर घनबरी

11

एक पुनरावर्ती संस्करण (संकलक बेहतर ढेर उपयोग के लिए एक पूंछ पुनरावृत्ति का पता लगाता है),

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

io.StdIn2.11 स्केल से उपयोग पर ध्यान दें । इस दृष्टिकोण के साथ भी ध्यान दें कि हम उपयोगकर्ता इनपुट को एक संग्रह में जमा कर सकते हैं जो अंततः वापस आ गया है - इसके अलावा इसका प्रिंट आउट भी लिया जा सकता है। अर्थात्,

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


0

जैसा कि अन्य टिप्पणियों में संक्षेप में कहा scala.Predef.readLine()गया है, स्केल 2.11.0 के बाद से हटा दिया गया है , और आप इसे इसके साथ बदल सकते हैं scala.io.StdIn.readLine():

// Read STDIN lines until a blank one
import scala.io.StdIn.readLine

var line = ""
do {
  line = readLine()
  println("Read: " + line)
} while (line != "")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.