อะไรคือความแตกต่างระหว่างวิธีการ next () และ nextLine () จากคลาส Scanner?


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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคลาส Scanner หรือคลาส String โปรดดูลิงก์ต่อไปนี้

เครื่องสแกน: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

สตริง: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html


5
แล้วทำไมไม่ใช้BufferedReaderเพื่ออ่านทีละบรรทัดล่ะ? ฉันไม่เข้าใจว่าทำไมถึงScannerอยู่ในสมัยนี้
David Conrad

7
@DavidConrad "อะไรคือความแตกต่างระหว่างวิธีการ next () และ nextLine () จากคลาส Scanner"
Tristan

4
ใช่ฉันรู้ว่านั่นคือสิ่งที่ OP กำลังถามฉันแค่สงสัยเพราะคุณบอกว่าคุณ "ชอบ" ที่จะใช้ nextLine เสมอ
David Conrad

คุณสามารถทำ nextLine () ได้อย่างปลอดภัยจากนั้นสร้างเครื่องสแกนใหม่เฉพาะสำหรับบรรทัดนั้น คลาส Scanner สามารถสแกนสตริง: new Scanner (new Scanner (System.in) .nextLine ())
axell13

48

next()สามารถอ่านอินพุตได้จนถึงช่องว่างเท่านั้น ไม่สามารถอ่านสองคำโดยคั่นด้วยช่องว่าง นอกจากนี้next()ให้วางเคอร์เซอร์ไว้ในบรรทัดเดียวกันหลังจากอ่านอินพุต

nextLine()อ่านอินพุตรวมถึงช่องว่างระหว่างคำ (นั่นคืออ่านจนถึงท้ายบรรทัด\n) เมื่ออ่านข้อมูลเข้าแล้วให้nextLine()วางเคอร์เซอร์ในบรรทัดถัดไป

สำหรับการอ่านทั้งบรรทัดคุณสามารถnextLine()ใช้ได้


@LuiggiMendoza คุณหมายถึงการจัดรูปแบบไม่ใช่การเขียนที่เป็นทางการ?
เดช

next () สามารถอ่านอินพุตได้จนถึงช่องว่างเท่านั้น มันไม่สามารถอ่านคำสองคำคั่นด้วยช่องว่าง ช่องว่างประกอบด้วยช่องว่างแท็บและตัวป้อนบรรทัด
Fred Hu

19

จาก JavaDoc:

  • Scannerแบ่งการป้อนข้อมูลเข้าไปในราชสกุลโดยใช้รูปแบบที่คั่นซึ่งโดยการแข่งขันเริ่มต้นช่องว่าง
  • next(): ค้นหาและส่งคืนโทเค็นที่สมบูรณ์ถัดไปจากเครื่องสแกนนี้
  • nextLine(): เลื่อนเครื่องสแกนนี้ผ่านบรรทัดปัจจุบันและส่งกลับข้อมูลที่ข้ามไป

ดังนั้นในกรณีที่"small example<eol>text" next()ควรกลับ "เล็ก" และnextLine()ควรกลับ "ตัวอย่างเล็ก"


1
ทำไมไม่next()รวม\nโทเค็นที่ส่งคืน ??
rimalroshan

2
นี่เป็นคำถามสำหรับนักออกแบบ Java API หรือโพสต์คำถามใน SO และอาจมีใครรู้ว่าทำไม
Oleg Sklyar

10

สิ่งที่ฉันสังเกตเห็นนอกเหนือจาก next () จะสแกนเฉพาะพื้นที่ไม่เกินโดยที่ nextLine () สแกนทั้งบรรทัดคือต่อไปจะรอจนกว่าจะได้รับโทเค็นที่สมบูรณ์โดยที่nextLine () ไม่รอโทเค็นที่สมบูรณ์เมื่อเคย '\ n' จะได้รับ (เช่นเมื่อคุณกดปุ่ม Enter) เคอร์เซอร์ของเครื่องสแกนจะเลื่อนไปที่บรรทัดถัดไปและส่งกลับบรรทัดก่อนหน้าที่ข้ามไป ไม่ได้ตรวจสอบว่าคุณได้ป้อนข้อมูลครบถ้วนหรือไม่แม้ว่าจะใช้สตริงว่างโดยที่ next () ไม่ใช้สตริงว่าง

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

}

ลองใช้โปรแกรมนี้โดยการเปลี่ยน next () และ nextLine () สำหรับลูปไปที่การกด '\ n' ที่เป็นปุ่ม Enter โดยไม่ต้องป้อนข้อมูลใด ๆ คุณจะพบว่าการใช้วิธีnextLine () จะสิ้นสุดหลังจากกดจำนวนกรณีที่กำหนดโดยที่ ดังต่อไป () จะไม่ยุติจนกว่าคุณจะระบุและป้อนข้อมูลตามจำนวนกรณีที่กำหนด


1
ตัวอย่างที่น่าสนใจมาก การรันโค้ดในที่สุดฉันก็เห็นวิธีการnext()ทำงานในทางปฏิบัติมันจะไม่สนใจคีย์ Enter ในขณะที่nexLine()ยอมรับว่าเป็นอินพุตที่สมบูรณ์และจะจำลองแบบไปยังคอนโซลหากคุณสะท้อนค่าของสิ่งที่ถูกจับ ฉันเพิ่งเพิ่มSystem.out.println(str[i]);เป็นบรรทัดใหม่ด้านล่างstr[i]=sc.next();หรือstr[i]=sc.nextLine();
Pablo Adames

@PabloAdames ชื่นชมถ้าคุณสามารถโหวตได้ถ้าคำตอบที่คุณต้องการ
murali krish

9

ประเด็นสำคัญคือการค้นหาว่าเมธอดจะหยุดที่ใดและเคอร์เซอร์จะอยู่ที่ใดหลังจากเรียกใช้เมธอด

วิธีการทั้งหมดจะอ่านข้อมูลที่ไม่รวมช่องว่างระหว่างตำแหน่งเคอร์เซอร์และตัวคั่นเริ่มต้นถัดไป (ช่องว่างแท็บ \ n - สร้างโดยการกด Enter) เคอร์เซอร์จะหยุดก่อนตัวคั่นยกเว้นnextLine()ซึ่งอ่านข้อมูล (รวมถึงช่องว่างที่สร้างโดยตัวคั่น) ระหว่างตำแหน่งเคอร์เซอร์และ \ 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 |


หลังจากนี้ควรเรียกวิธีการขึ้นอยู่กับความต้องการของคุณ


2
คำตอบที่ประเมินต่ำเช่นนี้ อย่างอื่นทำให้เข้าใจผิดเล็กน้อย
csguy

3

กล่าวโดยย่อ: หากคุณกำลังป้อนสตริงอาร์เรย์ที่มีความยาว t ดังนั้น Scanner # nextLine () จะคาดหวังบรรทัด t แต่ละรายการในอาร์เรย์สตริงจะแตกต่างจากที่อื่นด้วยปุ่ม Enter และ Scanner # next () จะรับอินพุตไปเรื่อย ๆ จนถึง คุณกด Enter แต่เก็บสตริง (คำ) ไว้ในอาร์เรย์ซึ่งคั่นด้วยช่องว่าง

มาดูตัวอย่างโค้ดต่อไปนี้

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

เมื่อฉันเรียกใช้ข้อมูลโค้ดด้านบนใน IDE ของฉัน (สมมติว่าสำหรับความยาวสตริง 2) ไม่สำคัญว่าฉันจะป้อนสตริงเป็น

ป้อนข้อมูลเป็น: - abcd abcd หรือ

ป้อนข้อมูลเป็น: -

เอบีซีดี

เอบีซีดี

ผลลัพธ์จะเป็นเหมือน abcd

เอบีซีดี

แต่ถ้าในรหัสเดียวกันเราแทนที่ next () วิธีการโดย nextLine ()

    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 (และหากคุณกด Enter เพื่อเข้าสู่ abcd ถัดไปในบรรทัดอื่นพรอมต์อินพุตจะออกและคุณจะได้รับเอาต์พุต)

เอาต์พุตคือ: -

เอบีซีดี


2

จากJavadocs

next () ส่งคืนโทเค็นถัดไปหากตรงกับรูปแบบที่สร้างจากสตริงที่ระบุ nextLine () เลื่อนสแกนเนอร์นี้ผ่านบรรทัดปัจจุบันและส่งคืนอินพุตที่ข้ามไป

คุณจะเลือกแบบไหนขึ้นอยู่กับความต้องการของคุณมากที่สุด ถ้าเป็นฉันอ่านทั้งไฟล์ฉันจะไปที่ nextLine จนกว่าฉันจะมีไฟล์ทั้งหมด


1

จากเอกสารสำหรับเครื่องสแกน :

เครื่องสแกนจะแบ่งอินพุตเป็นโทเค็นโดยใช้รูปแบบตัวคั่นซึ่งโดยค่าเริ่มต้นจะตรงกับช่องว่าง

จากเอกสารสำหรับnext () :

โทเค็นที่สมบูรณ์จะนำหน้าและตามด้วยอินพุตที่ตรงกับรูปแบบตัวคั่น


1

วิธีการ next () และ nextLine () เชื่อมโยงกับ Scanner และใช้สำหรับรับอินพุต String ความแตกต่างของพวกเขาคือ ...

next () สามารถอ่านอินพุตได้จนถึงช่องว่างเท่านั้น ไม่สามารถอ่านสองคำที่คั่นด้วยช่องว่าง นอกจากนี้ถัดไป () วางเคอร์เซอร์ไว้ในบรรทัดเดียวกันหลังจากอ่านอินพุต

nextLine () อ่านอินพุตรวมถึงช่องว่างระหว่างคำ (นั่นคืออ่านจนถึงท้ายบรรทัด \ n) เมื่ออ่านข้อมูลเข้าแล้ว nextLine () จะวางเคอร์เซอร์ในบรรทัดถัดไป

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

เอาท์พุต:

ป้อนสตริงสำหรับ c abc def
c คือ abc

ป้อนสตริงสำหรับ d

d คือ def

หากคุณใช้ nextLine () แทน next () แล้ว

เอาท์พุต:

ป้อนสตริงสำหรับ c

ABC DEF
c คือ ABC DEF
ป้อนสตริงสำหรับ d

GHI
d คือ GHI


1
  • สำหรับตัวอย่างอื่นของ Scanner.next () และ nextLine () เป็นดังต่อไปนี้: nextLine () ไม่อนุญาตให้ผู้ใช้พิมพ์ในขณะที่ next () ทำให้ Scanner รอและอ่านอินพุต

     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

สแกนเนอร์แบ่งการป้อนข้อมูลเข้าไปในราชสกุลโดยใช้รูปแบบที่คั่นซึ่งเป็นค่าเริ่มต้นเป็นที่รู้จักช่องว่าง

Next ()ใช้เพื่ออ่านคำเดียวและเมื่อได้รับช่องว่างสีขาวคำนั้นจะหยุดอ่านและเคอร์เซอร์กลับไปที่ตำแหน่งเดิม NextLine ()ในขณะที่คำนี้อ่านทั้งคำแม้ว่าจะตรงกับช่องว่างเคอร์เซอร์จะหยุดเมื่ออ่านเสร็จและเคอร์เซอร์กลับไปที่ท้ายบรรทัด ดังนั้นคุณไม่จำเป็นต้องใช้ตัวคั่นเมื่อคุณต้องการอ่านคำเต็มเป็นประโยคคุณเพียงแค่ต้องใช้ NextLine ()

 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

ฟังก์ชันทั้งสองใช้เพื่อย้ายไปยังโทเค็นเครื่องสแกนถัดไป

ความแตกต่างอยู่ที่วิธีสร้างโทเค็นเครื่องสแกน

next () สร้างโทเค็นสแกนเนอร์โดยใช้ตัวคั่นเป็นWhite Space

nextLine () สร้างโทเค็นสแกนเนอร์โดยใช้ตัวคั่นเป็น'\ n' (เช่นการกดปุ่ม Enter)


0

ฉันยังมีปัญหาเกี่ยวกับตัวคั่น คำถามคือทั้งหมดเกี่ยวกับปัจจัยการผลิตของ

  1. ใส่ชื่อของคุณ.
  2. ป้อนอายุของคุณ
  3. กรอกอีเมล์ของคุณ.
  4. ป้อนที่อยู่ของคุณ

ปัญหา

  1. ฉันกรอกชื่ออายุและอีเมลเรียบร้อยแล้ว
  2. เมื่อฉันหาที่อยู่ของคำสองคำที่มีช่องว่าง (ถนนฮาร์เน็ต) ฉันเพิ่งได้คำแรก "ฮาร์เน็ต"

การแก้ไขปัญหา

ฉันใช้ตัวคั่นสำหรับสแกนเนอร์ของฉันและออกไปได้สำเร็จ

ตัวอย่าง

 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

ความแตกต่างพื้นฐานคือ next () ใช้สำหรับการรับอินพุตจนกว่าจะพบตัวคั่น (โดยค่าเริ่มต้นจะเป็นช่องว่าง แต่คุณสามารถเปลี่ยนได้) และส่งคืนโทเค็นที่คุณป้อนจากนั้นเคอร์เซอร์จะยังคงอยู่ในบรรทัดเดียวกัน ในขณะที่ใน nextLine () จะสแกนอินพุตจนกว่าเราจะกดปุ่ม enter และคืนค่าทั้งหมดและวางเคอร์เซอร์ในบรรทัดถัดไป **

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

**

ลองรันโค้ดนี้โดยให้ Input เป็น "Hello World" สแกนเนอร์อ่านอินพุตจนถึง "o" จากนั้นตัวคั่นจะเกิดขึ้นดังนั้น s [0] จะเป็น "Hello" และเคอร์เซอร์จะชี้ไปที่ตำแหน่งถัดไปหลังจากตัวคั่น ( นั่นคือ 'W' ในกรณีของเรา) และเมื่อ s [1] ถูกอ่านมันจะสแกน "โลก" และส่งคืนเป็น s [1] เป็นโทเค็นที่สมบูรณ์ถัดไป (ตามคำจำกัดความของเครื่องสแกนเนอร์) หากเราใช้ nextLine () แต่มันจะอ่าน "Hello World" อย่างเต็มที่และอีกมากมายจนกว่าเราจะกดปุ่ม enter และเก็บไว้ใน s [0] เราอาจให้สตริงอื่นได้โดยใช้ nextLine () ฉันขอแนะนำให้คุณลองใช้ตัวอย่างนี้และอื่น ๆ และขอคำชี้แจงใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.