2011-01-03 18 views
86

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

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

उत्तर

126

सबसे सीधे-आगे देखने वाला दृष्टिकोण केवल 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) 
    } 
} 
52

कंसोल के लिए आप 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)) 
+0

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

+10

मुझे लगता है कि आपका मतलब है 'टेकवाइल्ड (_! = Null) ' –

+1

निर्भर करता है कि आप कैसे रुकना चाहते हैं। एक खाली रेखा की तलाश अक्सर सबसे सरल समाधान है। – Landei

26
val input = Source.fromInputStream(System.in); 
val lines = input.getLines.collect 
+3

'io.Source.stdin' को परिभाषित किया गया है (' scala.io.Source' वर्ग में) 'def stdin = fromInputStream (System.in)' के रूप में संभवतः 'io.Source.stdin' के साथ रहना बेहतर है। –

+0

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

10

आप

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

के रूप में यहाँ उपलब्ध उपयोग नहीं कर सकते: Scaladoc API

7

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

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

स्कैला 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]()) 
} 
संबंधित मुद्दे