স্ক্যানার ক্লাস থেকে পরবর্তী () এবং নেক্সটলাইন () পদ্ধতির মধ্যে পার্থক্য কী?


89

next()এবং এর মধ্যে প্রধান পার্থক্য কী nextLine()?
আমার মূল লক্ষ্যটি হ'ল যে কোনও উত্সেরScanner সাথে "সংযুক্ত" থাকতে পারে এমন ব্যবহার করে সমস্ত পাঠ্য পড়া (উদাহরণস্বরূপ ফাইল)।

আমার কোনটি বেছে নেওয়া উচিত এবং কেন?


এই আপনাকে সাহায্য করতে পারেন [ব্যবহার scanner.nextLine ()] [1]: stackoverflow.com/questions/5032356/using-scanner-nextline
Milaci

উত্তর:


86

আমি সর্বদা ইনপুট ব্যবহার nextLine()করে স্ট্রিংটিকে বিশ্লেষণ করে পড়তে পছন্দ করি ।

ব্যবহারের next()ফলে ডিলিমিটারের পূর্বে যা আসবে তা ফিরে আসবে (হোয়াইটস্পেসে ডিফল্ট)। nextLine()বর্তমান লাইনটি ফিরে আসার পরে স্বয়ংক্রিয়ভাবে স্ক্যানারটিকে সরিয়ে দেয়।

থেকে ডেটা পার্সিংয়ের জন্য একটি দরকারী সরঞ্জাম nextLine()হবে str.split("\\s+")

String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces

স্ক্যানার ক্লাস বা স্ট্রিং ক্লাস সম্পর্কিত আরও তথ্যের জন্য নীচের লিঙ্কগুলিতে পড়ুন।

স্ক্যানার: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

স্ট্রিং: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html


4
সুতরাং, কেন কেবল BufferedReaderলাইন বাই লাইন পড়তে ব্যবহার করবেন না ? আমি বুঝতে পারছি না কেন Scannerএমন প্রচলন রয়েছে।
ডেভিড কনরাড

7
@ ডেভিডকনরাদ "স্ক্যানার ক্লাস থেকে পরবর্তী () এবং নেক্সটলাইন () পদ্ধতির মধ্যে পার্থক্য কী?"
ত্রিস্তান

4
হ্যাঁ, আমি বুঝতে পারি যে ওপি যা সম্পর্কে জিজ্ঞাসা করছিল, আমি তখনই ভাবছিলাম যেহেতু আপনি বলছেন যে আপনি নেক্সটলাইন ব্যবহার করতে "সর্বদা পছন্দ করেন"।
ডেভিড কনরাড

আপনি নিরাপদে একটি নেক্সটলাইন () করতে পারেন এবং তারপরে কেবল সেই লাইনের জন্য একটি নতুন স্ক্যানার তৈরি করতে পারেন। স্ক্যানার শ্রেণি স্ট্রিংগুলি স্ক্যান করতে পারে: নতুন স্ক্যানার (নতুন স্ক্যানার (System.in) .nextLine ())।
axell13

48

next()কেবল স্থান পর্যন্ত ইনপুট পড়তে পারে। এটি একটি স্পেস দ্বারা পৃথক দুটি শব্দ পড়তে পারে না। এছাড়াও, next()ইনপুট পড়ার পরে কার্সারটিকে একই লাইনে রাখে।

nextLine()শব্দের মধ্যে স্থান সহ ইনপুট পড়ে (যা এটি লাইনের শেষ পর্যন্ত পড়ে \n)। ইনপুটটি একবার পড়ার পরে, nextLine()পরবর্তী লাইনে কার্সারটি অবস্থান করে।

পুরো লাইনটি পড়ার জন্য আপনি ব্যবহার করতে পারেন nextLine()


@ লুইগিগেনডোজা বলতে আপনার বোঝানো হচ্ছে ফর্ম্যাট করা, ফর্মাল লেখা নয়?
বিশ

পরবর্তী () কেবল সাদা স্থান পর্যন্ত ইনপুটটি পড়তে পারে । এটি একটি সাদা জায়গার দ্বারা পৃথক দুটি শব্দ পড়তে পারে না । হোয়াইটস্পেসে স্পেস, ট্যাব এবং লাইনফিড রয়েছে
ফ্রেড হু

19

জাভাডক থেকে:

  • একটি Scannerবিরতি একটি বিভেদক প্যাটার্ন, যা ডিফল্টভাবে হোয়াইটস্পেস ম্যাচ ব্যবহার টোকেন মধ্যে নিজের ইনপুট।
  • next(): এই স্ক্যানার থেকে পরবর্তী সম্পূর্ণ টোকেন সন্ধান করে এবং প্রদান করে।
  • nextLine(): এই স্ক্যানারটিকে বর্তমান লাইনের মধ্য দিয়ে অগ্রসর করে এবং এড়িয়ে যাওয়া ইনপুটটি ফেরত দেয়।

সুতরাং "small example<eol>text" next()"ছোট" nextLine()ফিরে আসা উচিত এবং "ছোট উদাহরণ" ফিরিয়ে দেওয়া উচিত


4
কেন ফেরত টোকেনটি next()অন্তর্ভুক্ত করবেন না \n??
রিমাল্রোশন

4
এটি জাভা এপিআই ডিজাইনারদের কাছে একটি প্রশ্ন, বা এসওতে একটি প্রশ্ন পোস্ট করুন এবং কেন কেউ তা জানেন।
ওলেগ স্ক্লায়ার

10

পরের () থেকে আলাদা করে আমি যা লক্ষ্য করেছি তা কেবল স্থান পর্যন্ত স্ক্যান করে যেখানে নেক্সটলাইন () পুরো লাইনটি স্ক্যান করে এটি পরের অপেক্ষা করে এটি সম্পূর্ণ টোকেন না পাওয়া পর্যন্ত যেখানে নেক্সটলাইন () সম্পূর্ণ টোকেনের জন্য অপেক্ষা করে না, কখন '' n ' প্রাপ্ত হয় (অর্থাত্‍ যখন আপনি কী কী চাপুন) স্ক্যানার কার্সারটি পরবর্তী লাইনে চলে যায় এবং আগের লাইনটি এড়িয়ে যায় returns আপনি সম্পূর্ণ ইনপুট দিয়েছেন কিনা তা এটি পরীক্ষা করে না, এমনকি এটি খালি স্ট্রিং নেবে যেখানে পরের () খালি স্ট্রিং নেয় না

public class ScannerTest {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        String []str = new String[cases];
        for(int i=0;i<cases;i++){
            str[i]=sc.next();
        }
     }

}

পরের () এবং নেক্সটলাইন () লুপের জন্য পরিবর্তন করে এই প্রোগ্রামটি ব্যবহার করে দেখুন, '\ n' টিপুন যা কোনও ইনপুট ছাড়াই কী প্রবেশ করায়, আপনি দেখতে পাবেন যে নেক্সটলাইন () পদ্ধতিটি ব্যবহার করে এটি প্রদত্ত সংখ্যার ক্ষেত্রে চাপ দেওয়ার পরে শেষ হয় যেখানে পরবর্তী হিসাবে () প্রদত্ত মামলার সংখ্যার জন্য আপনি সরবরাহ না করা অবধি এটি শেষ করে না এবং এতে ইনপুট দিন।


4
খুব আকর্ষণীয় উদাহরণ। কোডটি next()চালিয়ে গিয়ে অবশেষে দেখলাম যে অনুশীলনে কীভাবে কাজ করা হয়, এটি এন্টার কীটিকে অগ্রাহ্য করে না, যদিও nexLine()এটি সম্পূর্ণ ইনপুট হিসাবে গ্রহণ করে এবং এটি কী ক্যাপচার করেছিল তার মান প্রতিধ্বনিত করে কনসোলে প্রতিলিপি তৈরি করে। আমি শুধু যোগ System.out.println(str[i]);নিচে একটি নতুন লাইন হিসেবে str[i]=sc.next();বাstr[i]=sc.nextLine();
পাবলো Adames

@ পাবলোএডামস প্রশংসা করেন আপনি যদি উত্তরটি পছন্দ করতে পারেন তবে উত্তরটি যদি পছন্দ করেন তবে
মুরালি কৃষিশ

9

মূল বিষয়টি হল পদ্ধতিগুলি কল করার পরে পদ্ধতিটি কোথায় থামবে এবং কার্সারটি কোথায় থাকবে তা খুঁজে বার করা।

সমস্ত পদ্ধতিতে তথ্য পড়বে যা কার্সার অবস্থান এবং পরবর্তী ডিফল্ট ডেলিফিটারগুলির মধ্যে (সাদা স্থান, ট্যাব, \ n - এন্টার টিপে তৈরি করা) মধ্যে শ্বেত স্পেস অন্তর্ভুক্ত করে না। কার্সারটি সীমানা ছাড়ানো ব্যতীত nextLine()কার্সার অবস্থান এবং \ n এর মধ্যে তথ্য (সীমান্তকারীদের দ্বারা তৈরি হোয়াইটস্পেস সহ) পড়া বন্ধ করে and n এবং কার্সারটি পিছনে থামে \ n।


উদাহরণস্বরূপ, নিম্নলিখিত চিত্রটি বিবেচনা করুন:

|23_24_25_26_27\n

| -> বর্তমান কার্সার অবস্থান

_ -> সাদা স্থান

স্ট্রিম -> সাহসী (কলিং পদ্ধতিতে প্রাপ্ত তথ্য)

আপনি যখন এই পদ্ধতিগুলি কল করেন তখন কী ঘটে তা দেখুন:

nextInt()    

পড়া 23 | _24_25_26_27 \ N

nextDouble()

23_ 24 | _25_26_27 \ n পড়ুন

next()

23_24_ 25 | _26_27 \ n পড়ুন

nextLine()

23_24_25 _26_27 \ n | পড়ুন


এর পরে, আপনার প্রয়োজনের উপর নির্ভর করে পদ্ধতিটি কল করা উচিত।


4
যেমন একটি আন্ডাররেটেড উত্তর। সমস্ত কিছু সামান্য বিভ্রান্তিকর
সিএসগুয়ে

3

সংক্ষেপে: আপনি যদি দৈর্ঘ্যের টিয়ের স্ট্রিং অ্যারে ইনপুট করে থাকেন তবে স্ক্যানার # নেক্সটলাইন () টি লাইন প্রত্যাশা করে, স্ট্রিং অ্যারেতে প্রতিটি এন্ট্রি কী দ্বারা প্রবেশের দ্বারা আলাদা করা হয় nd এবং স্ক্যানার # পরবর্তী () অবধি ইনপুট গ্রহণ করতে থাকবে আপনি এন্টার টিপুন কিন্তু অ্যারের ভিতরে স্ট্রিং (শব্দ) সঞ্চয় করেন, যা হোয়াইটস্পেস দ্বারা পৃথক করা হয়।

নীচের কোডের স্নিপেটটি দেখে নেওয়া যাক

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.next();
    }

আমি যখন আমার আইডিইতে কোডের স্নিপেটের উপরে চলে যাই (স্ট্রিং দৈর্ঘ্যের জন্য বলি 2), আমি আমার স্ট্রিং হিসাবে প্রবেশ করি কিনা তাতে কিছু যায় আসে না does

ইনপুট হিসাবে: - abcd abcd বা

ইনপুট হিসাবে:

এ বি সি ডি

এ বি সি ডি

আউটপুটটি এবিডির মতো হবে

এ বি সি ডি

তবে যদি একই কোডে আমরা পরবর্তী () পদ্ধতিটি পরের লাইনের () দ্বারা প্রতিস্থাপন করি

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.nextLine();
    }

তারপরে যদি আপনি প্রম্পটে যেমন ইনপুট প্রবেশ করেন - abcd abcd

আউটপুট হ'ল: -

abcd abcd

এবং আপনি যদি abcd হিসাবে প্রম্পটে ইনপুট প্রবেশ করান (এবং আপনি যদি অন্য লাইনে পরবর্তী এবিসিডি প্রবেশ করতে এন্টার টিপেন তবে ইনপুট প্রম্পটটি কেবল প্রস্থান করবে এবং আপনি আউটপুট পাবেন)

আউটপুট হ'ল: -

এ বি সি ডি


2

জাভাডোকস থেকে

পরবর্তী () এটি নির্দিষ্ট স্ট্রিং থেকে নির্মিত প্যাটার্নটির সাথে মেলে যদি পরবর্তী টোকেনটি দেয়। পরের লাইনে () এই স্ক্যানারটিকে বর্তমান লাইনের অতীত হয়ে যায় এবং এড়িয়ে যাওয়া ইনপুটটি ফেরত দেয়।

আপনি কোনটি বেছে নিন তা নির্ভর করে কোনটি আপনার প্রয়োজনের পক্ষে সবচেয়ে বেশি উপযুক্ত। এটি যদি আমার একটি সম্পূর্ণ ফাইল পড়ত তবে আমার সমস্ত ফাইল না হওয়া পর্যন্ত আমি নেক্সটলাইনটিতে যাব।


1

স্ক্যানারের জন্য ডকুমেন্টেশন থেকে :

একটি স্ক্যানার একটি ডিলিমিটার প্যাটার্ন ব্যবহার করে টোকেনগুলিতে তার ইনপুটটি ভেঙে দেয়, যা ডিফল্টরূপে সাদা স্থানের সাথে মেলে।

পরবর্তী () এর জন্য ডকুমেন্টেশন থেকে :

একটি সম্পূর্ণ টোকেন পূর্ববর্তী এবং ডিলিমিটার প্যাটার্নের সাথে মেলে এমন ইনপুট অনুসরণ করে।


1

পরবর্তী () এবং নেক্সটলাইন () পদ্ধতিগুলি স্ক্যানারের সাথে সম্পর্কিত এবং স্ট্রিং ইনপুট পেতে ব্যবহৃত হয়। তাদের পার্থক্যগুলি হ'ল ...

পরবর্তী () কেবল স্থান পর্যন্ত ইনপুটটি পড়তে পারে। এটি স্থান দ্বারা পৃথক দুটি শব্দ পড়তে পারে না। এছাড়াও, পরবর্তী () ইনপুট পড়ার পরে একই লাইনটিতে কার্সারটি রাখে।

নেক্সটলাইন () শব্দের মধ্যে স্থান সহ ইনপুট পড়ে (যা এটি লাইনের শেষ পর্যন্ত পড়ে \ n)। ইনপুটটি একবার পড়ার পরে, নেক্সটলাইন () পরবর্তী লাইনে কার্সারকে অবস্থান করে।

import java.util.Scanner;

public class temp
{
    public static void main(String arg[])
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("enter string for c");
        String c=sc.next();
        System.out.println("c is "+c);
        System.out.println("enter string for d");
        String d=sc.next();
        System.out.println("d is "+d);
    }
}

আউটপুট:

সি abc ডিফ
সি এর জন্য স্ট্রিং লিখুন abc

d এর জন্য স্ট্রিং প্রবেশ করান

ডি ডিএফ হয়

আপনি যদি পরের () এর পরিবর্তে নেক্সটলাইন () ব্যবহার করেন

আউটপুট:

গ জন্য স্ট্রিং লিখুন

ABC DEF
c হ'ল ABC DEF
d এর জন্য স্ট্রিং প্রবেশ করান

জিআইআই
ডি জিআইআই


1
  • স্ক্যানার.নেক্সট () এবং নেক্সটলাইন () এর অন্য উদাহরণের জন্য এটি নীচের মত: নেক্সটলাইন () পরবর্তী সময়ে () স্ক্যানারকে অপেক্ষা করে এবং ইনপুটটি পড়তে দেয় না এমন ক্ষেত্রে ব্যবহারকারীকে টাইপ করতে দেয় না।

     Scanner sc = new Scanner(System.in);
    
     do {
        System.out.println("The values on dice are :");
        for(int i = 0; i < n; i++) {
            System.out.println(ran.nextInt(6) + 1);
        }
        System.out.println("Continue : yes or no");
     } while(sc.next().equals("yes"));
    // while(sc.nextLine().equals("yes"));
    

1

একটি স্ক্যানার একটি বিভেদক প্যাটার্ন, যা পরিচিত ডিফল্টরূপে ব্যবহার টোকেন মধ্যে নিজের ইনপুট ভঙ্গ অনুসরণকারী শূণ্যস্থান

পরবর্তী () একক শব্দটি পড়তে ব্যবহার করে এবং যখন এটি একটি সাদা স্থান পায়, এটি পড়া বন্ধ করে দেয় এবং কার্সারটিকে তার মূল অবস্থানে ফিরে আসে। নেক্সটলাইন () যখন এটি একটি পুরো শব্দটি শ্বেতস্পেসের সাথে মিলিত হয় তখনও এটি পড়তে থাকে reading পাঠক শেষ করার সাথে সাথে কার্সারটি বন্ধ হয়ে যায় এবং কার্সার লাইনের শেষ দিকে ফিরে যায়। সুতরাং আপনি যখন বাক্য হিসাবে একটি পূর্ণ শব্দ পড়তে চান তখন আপনাকে একটি ডিলিমেটার ব্যবহার করার দরকার নেই। আপনাকে কেবল নেক্সটলাইন () ব্যবহার করতে হবে।

 public static void main(String[] args) {
            // TODO code application logic here
           String str;
            Scanner input = new Scanner( System.in );
            str=input.nextLine();
            System.out.println(str);
       }

1

উভয় ফাংশন পরবর্তী স্ক্যানার টোকেন এ যেতে ব্যবহৃত হয়।

পার্থক্যটি স্ক্যানার টোকেন কীভাবে উত্পন্ন হয় তার মধ্যে রয়েছে

পরবর্তী () হোয়াইট স্পেস হিসাবে ডিলিমিটার ব্যবহার করে স্ক্যানার টোকেন উত্পন্ন করে

নেক্সটলাইন () '\ n' হিসাবে ডিলিমিটার ব্যবহার করে স্ক্যানার টোকেন উত্পন্ন করে (যেমন কী চাপুন)


0

একটি ডিলিমিটার সম্পর্কেও আমি একটি সমস্যা পেয়েছি। প্রশ্ন সব ইনপুট সম্পর্কে ছিল

  1. আপনার নাম প্রবেশ করুন.
  2. আপনার বয়স প্রবেশ.
  3. তুমার ইমেইল প্রবেশ করাও.
  4. আপনার ঠিকানা লিখুন

সমস্যাটি

  1. নাম, বয়স এবং ইমেল সহ আমি সাফল্যের সাথে শেষ করেছি।
  2. আমি যখন কোনো থাকার দুটি শব্দ করছে তার ঠিকানার সাথে নিয়ে এসেছেন হোয়াইটস্পেস (Harnet রাস্তায়) আমি শুধুমাত্র প্রথম একটি "harnet" পেয়েছিলাম।

সমাধান

আমি আমার স্ক্যানারের জন্য ডিলিমিটারটি ব্যবহার করেছি এবং সফল হয়ে গিয়েছিলাম।

উদাহরণ

 public static void main (String args[]){
     //Initialize the Scanner this way so that it delimits input using a new line character.
    Scanner s = new Scanner(System.in).useDelimiter("\n");
    System.out.println("Enter Your Name: ");
    String name = s.next();
    System.out.println("Enter Your Age: ");
    int age = s.nextInt();
    System.out.println("Enter Your E-mail: ");
    String email = s.next();
    System.out.println("Enter Your Address: ");
    String address = s.next();

    System.out.println("Name: "+name);
    System.out.println("Age: "+age);
    System.out.println("E-mail: "+email);
    System.out.println("Address: "+address);
}

0

মূল পার্থক্যটি পরের () ডিলিমিটারের মুখোমুখি না হওয়া অবধি ইনপুট পাওয়ার জন্য ব্যবহৃত হয় (ডিফল্টরূপে এটি হোয়াইটস্পেস হয় তবে আপনি এটি পরিবর্তনও করতে পারেন) এবং আপনি যে টোকেনটি প্রবেশ করেছেন তা ফেরত দিতে পারেন curs কার্সারটি একই লাইনে থাকবে on যদিও নেক্সটলাইন () এ এটি ইনপুটটি স্ক্যান করে যতক্ষণ না আমরা প্রবেশ বোতাম টিপুন এবং পুরো জিনিসটি ফিরিয়ে না ফেলে এবং কার্সারটিকে পরের লাইনে রাখি। **

        Scanner sc=new Scanner(System.in);
        String s[]=new String[2];
        for(int i=0;i<2;i++){
            s[i]=sc.next();
        }
        for(int j=0;j<2;j++)
        {
            System.out.println("The string at position "+j+ " is "+s[j]);
        }

**

"হ্যালো ওয়ার্ল্ড" হিসাবে ইনপুট দিয়ে এই কোডটি চালনার চেষ্টা করুন scan স্ক্যানারটি 'ও' অবধি ইনপুটটি পড়ে এবং তার পরে একটি ডিলিমিটার ঘটে so সুতরাং [0] "হ্যালো" হবে এবং কার্সারটি ডিলিমিটারের পরে পরবর্তী অবস্থানে নির্দেশ করবে ( এটি আমাদের ক্ষেত্রে 'ডাব্লু'), এবং যখন [1] পড়লে এটি "ওয়ার্ল্ড" স্ক্যান করে এবং এটি [1] এ পরবর্তী সম্পূর্ণ টোকেন (স্ক্যানারের সংজ্ঞা অনুসারে) হিসাবে ফিরিয়ে দেয় f আমরা যদি পরের লাইনে () ব্যবহার করি তবে পরিবর্তে, এটি "হ্যালো ওয়ার্ল্ড" পুরোপুরি পড়বে এবং আরও যতক্ষণ না আমরা প্রবেশ বোতামে চাপ দিয়ে এটিকে [0] এ সংরক্ষণ করি। আমরা নেক্সটলাইন () ব্যবহার করে আরও একটি স্ট্রিং দিতে পারি। আমি আপনাকে এই উদাহরণটি আরও ব্যবহার করার চেষ্টা করার পরামর্শ দিচ্ছি এবং কোনও স্পষ্টতার জন্য জিজ্ঞাসা করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.