লাইনে স্ট্যান্ডার্ড ইনপুট লাইন থেকে কীভাবে পড়বেন?


91

স্ট্যান্ডার্ড ইনপুট থেকে লাইন লাইনে পড়ার স্কেল রেসিপি কী? সমতুল্য জাভা কোডের মতো কিছু:

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

4
প্রিডাফের পদ্ধতিটি পড়ার লাইনটি ২.১১.০.২০১ since সাল থেকে অবচিত করা হয়েছে, এখন এটি পদ্ধতিটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছেscala.io.StdIn
নিকোলাসট্রেস

4
@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))

আমি কনসোল.রেডলাইন () সম্পর্কে জানি, আমি একটি প্রদত্ত রেসিপি খুঁজছি। স্ট্যান্ডার্ড ইনপুট থেকে লাইন লাইন পড়ার জন্য "স্কেলা" উপায়।
Andrei Ciobanu

11
আমি মনে করি আপনি বোঝাতে চেয়েছেনtakeWhile(_ != null)
শেঠ তিশু

4
আপনি কীভাবে থামাতে চান তা নির্ভর করে। খালি লাইনের সন্ধান করা প্রায়শই সহজ সমাধান।
ল্যান্ডেই

4
নোট করুন যে স্কেলা ২.১১.০ থেকে অবহিত Console.readLineকরা হয়েছে, StdIn.readlineপরিবর্তে ব্যবহার করুন।
বার্তোমিয়েজ স্যাজাচ

অথবা .takeWhile(Option(_).nonEmpty)আপনি nullকীওয়ার্ডটি পুরোপুরি এড়াতে চাইলে আরও ভাল লাগতে পারে ।
joiny

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 এর সাথে কাজ করছে বলে মনে হয় না, বা আমদানির জন্য সঠিক জিনিসগুলি আমি পাইনি।
akauppi

এটি স্কেলা ২.১২ তে কাজ করে, কেবলমাত্র collectএই উত্তরটির পদ্ধতিটি পরিবর্তিত হয়েছে যাতে আপনাকে কেবল কল করতে হবে input.getLinesযা আপনাকে একটি উত্তর দেয় Iterator। আপনি এটি ব্যবহার করে .toStreamবা .toListএটির উপর বাস্তবায়ন করতে বাধ্য করতে পারেন , এটি ব্যবহারের ক্ষেত্রে নির্ভর করে।
নাদের ঘানবাড়ী

11

একটি পুনরাবৃত্ত সংস্করণ (সংকলক উন্নত হিপ ব্যবহারের জন্য একটি লেজ পুনরাবৃত্তি সনাক্ত করে),

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

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


1

অন্যান্য মন্তব্যে সংক্ষিপ্তভাবে উল্লিখিত হিসাবে, স্কালার ২.১১.০ এর পরে অবহেলা scala.Predef.readLine()করা হয়েছে এবং আপনি এটির সাথে প্রতিস্থাপন করতে পারেন 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 != "")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.