อะไรคือความแตกต่างหลักระหว่างnext()
และnextLine()
?
เป้าหมายหลักของฉันคือการอ่านข้อความทั้งหมดโดยใช้Scanner
ซึ่งอาจ "เชื่อมต่อ" กับแหล่งที่มาใดก็ได้ (เช่นไฟล์)
ฉันควรเลือกแบบใดและเพราะเหตุใด
อะไรคือความแตกต่างหลักระหว่างnext()
และnextLine()
?
เป้าหมายหลักของฉันคือการอ่านข้อความทั้งหมดโดยใช้Scanner
ซึ่งอาจ "เชื่อมต่อ" กับแหล่งที่มาใดก็ได้ (เช่นไฟล์)
ฉันควรเลือกแบบใดและเพราะเหตุใด
คำตอบ:
ฉันชอบอ่านอินพุตโดยใช้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
BufferedReader
เพื่ออ่านทีละบรรทัดล่ะ? ฉันไม่เข้าใจว่าทำไมถึงScanner
อยู่ในสมัยนี้
next()
สามารถอ่านอินพุตได้จนถึงช่องว่างเท่านั้น ไม่สามารถอ่านสองคำโดยคั่นด้วยช่องว่าง นอกจากนี้next()
ให้วางเคอร์เซอร์ไว้ในบรรทัดเดียวกันหลังจากอ่านอินพุต
nextLine()
อ่านอินพุตรวมถึงช่องว่างระหว่างคำ (นั่นคืออ่านจนถึงท้ายบรรทัด\n
) เมื่ออ่านข้อมูลเข้าแล้วให้nextLine()
วางเคอร์เซอร์ในบรรทัดถัดไป
สำหรับการอ่านทั้งบรรทัดคุณสามารถnextLine()
ใช้ได้
จาก JavaDoc:
Scanner
แบ่งการป้อนข้อมูลเข้าไปในราชสกุลโดยใช้รูปแบบที่คั่นซึ่งโดยการแข่งขันเริ่มต้นช่องว่างnext()
: ค้นหาและส่งคืนโทเค็นที่สมบูรณ์ถัดไปจากเครื่องสแกนนี้nextLine()
: เลื่อนเครื่องสแกนนี้ผ่านบรรทัดปัจจุบันและส่งกลับข้อมูลที่ข้ามไป
ดังนั้นในกรณีที่"small example<eol>text"
next()
ควรกลับ "เล็ก" และnextLine()
ควรกลับ "ตัวอย่างเล็ก"
next()
รวม\n
โทเค็นที่ส่งคืน ??
สิ่งที่ฉันสังเกตเห็นนอกเหนือจาก 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 () จะสิ้นสุดหลังจากกดจำนวนกรณีที่กำหนดโดยที่ ดังต่อไป () จะไม่ยุติจนกว่าคุณจะระบุและป้อนข้อมูลตามจำนวนกรณีที่กำหนด
next()
ทำงานในทางปฏิบัติมันจะไม่สนใจคีย์ Enter ในขณะที่nexLine()
ยอมรับว่าเป็นอินพุตที่สมบูรณ์และจะจำลองแบบไปยังคอนโซลหากคุณสะท้อนค่าของสิ่งที่ถูกจับ ฉันเพิ่งเพิ่มSystem.out.println(str[i]);
เป็นบรรทัดใหม่ด้านล่างstr[i]=sc.next();
หรือstr[i]=sc.nextLine();
ประเด็นสำคัญคือการค้นหาว่าเมธอดจะหยุดที่ใดและเคอร์เซอร์จะอยู่ที่ใดหลังจากเรียกใช้เมธอด
วิธีการทั้งหมดจะอ่านข้อมูลที่ไม่รวมช่องว่างระหว่างตำแหน่งเคอร์เซอร์และตัวคั่นเริ่มต้นถัดไป (ช่องว่างแท็บ \ 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 |
หลังจากนี้ควรเรียกวิธีการขึ้นอยู่กับความต้องการของคุณ
กล่าวโดยย่อ: หากคุณกำลังป้อนสตริงอาร์เรย์ที่มีความยาว 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 ถัดไปในบรรทัดอื่นพรอมต์อินพุตจะออกและคุณจะได้รับเอาต์พุต)
เอาต์พุตคือ: -
เอบีซีดี
จากJavadocs
next () ส่งคืนโทเค็นถัดไปหากตรงกับรูปแบบที่สร้างจากสตริงที่ระบุ nextLine () เลื่อนสแกนเนอร์นี้ผ่านบรรทัดปัจจุบันและส่งคืนอินพุตที่ข้ามไป
คุณจะเลือกแบบไหนขึ้นอยู่กับความต้องการของคุณมากที่สุด ถ้าเป็นฉันอ่านทั้งไฟล์ฉันจะไปที่ nextLine จนกว่าฉันจะมีไฟล์ทั้งหมด
จากเอกสารสำหรับเครื่องสแกน :
เครื่องสแกนจะแบ่งอินพุตเป็นโทเค็นโดยใช้รูปแบบตัวคั่นซึ่งโดยค่าเริ่มต้นจะตรงกับช่องว่าง
จากเอกสารสำหรับnext () :
โทเค็นที่สมบูรณ์จะนำหน้าและตามด้วยอินพุตที่ตรงกับรูปแบบตัวคั่น
วิธีการ 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
สำหรับตัวอย่างอื่นของ 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"));
สแกนเนอร์แบ่งการป้อนข้อมูลเข้าไปในราชสกุลโดยใช้รูปแบบที่คั่นซึ่งเป็นค่าเริ่มต้นเป็นที่รู้จักช่องว่าง
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);
}
ฟังก์ชันทั้งสองใช้เพื่อย้ายไปยังโทเค็นเครื่องสแกนถัดไป
ความแตกต่างอยู่ที่วิธีสร้างโทเค็นเครื่องสแกน
next () สร้างโทเค็นสแกนเนอร์โดยใช้ตัวคั่นเป็นWhite Space
nextLine () สร้างโทเค็นสแกนเนอร์โดยใช้ตัวคั่นเป็น'\ n' (เช่นการกดปุ่ม Enter)
ฉันยังมีปัญหาเกี่ยวกับตัวคั่น คำถามคือทั้งหมดเกี่ยวกับปัจจัยการผลิตของ
ปัญหา
การแก้ไขปัญหา
ฉันใช้ตัวคั่นสำหรับสแกนเนอร์ของฉันและออกไปได้สำเร็จ
ตัวอย่าง
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);
}
ความแตกต่างพื้นฐานคือ 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 () ฉันขอแนะนำให้คุณลองใช้ตัวอย่างนี้และอื่น ๆ และขอคำชี้แจงใด ๆ