Sự khác biệt chính giữa next()
và là nextLine()
gì?
Mục tiêu chính của tôi là đọc tất cả văn bản bằng cách sử dụng một văn bản Scanner
có thể được "kết nối" với bất kỳ nguồn nào (ví dụ: tệp).
Tôi nên chọn cái nào và tại sao?
Sự khác biệt chính giữa next()
và là nextLine()
gì?
Mục tiêu chính của tôi là đọc tất cả văn bản bằng cách sử dụng một văn bản Scanner
có thể được "kết nối" với bất kỳ nguồn nào (ví dụ: tệp).
Tôi nên chọn cái nào và tại sao?
Câu trả lời:
Tôi luôn thích đọc đầu vào bằng cách sử dụng nextLine()
và sau đó phân tích cú pháp chuỗi.
Việc sử dụng next()
sẽ chỉ trả về những gì đứng trước dấu phân cách (mặc định là khoảng trắng). nextLine()
tự động di chuyển máy quét xuống sau khi trả về dòng hiện tại.
Một công cụ hữu ích để phân tích dữ liệu từ nextLine()
sẽ là str.split("\\s+")
.
String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces
Để biết thêm thông tin về lớp Máy quét hoặc lớp Chuỗi, hãy tham khảo các liên kết sau.
Máy quét: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
Chuỗi: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
BufferedReader
để đọc từng dòng? Tôi không hiểu tại sao lại Scanner
thịnh hành như vậy.
next()
chỉ có thể đọc đầu vào cho đến khoảng trống. Nó không thể đọc hai từ cách nhau bởi dấu cách. Ngoài ra, hãy next()
đặt con trỏ vào cùng một dòng sau khi đọc đầu vào.
nextLine()
đọc đầu vào bao gồm khoảng trống giữa các từ (nghĩa là nó đọc cho đến cuối dòng \n
). Khi đầu vào được đọc, nextLine()
đặt con trỏ ở dòng tiếp theo.
Để đọc toàn bộ dòng, bạn có thể sử dụng nextLine()
.
Từ JavaDoc:
- A
Scanner
ngắt đầu vào của nó thành các mã thông báo bằng cách sử dụng một mẫu dấu phân cách, theo mặc định sẽ khớp với khoảng trắng.next()
: Tìm và trả về mã thông báo hoàn chỉnh tiếp theo từ máy quét này.nextLine()
: Tiến bộ quét này qua dòng hiện tại và trả về đầu vào đã bị bỏ qua.
Vì vậy, trong trường hợp "small example<eol>text"
next()
nên trả về "nhỏ" và nextLine()
nên trả về "ví dụ nhỏ"
next()
bao gồm \n
trong mã thông báo trả lại ??
Những gì tôi đã nhận thấy ngoài next () chỉ quét tối đa không gian nơi mà nextLine () quét toàn bộ dòng là tiếp theo sẽ đợi cho đến khi nó nhận được mã thông báo hoàn chỉnh trong đó nextLine () không đợi mã hoàn chỉnh, bao giờ '\ n' thu được (tức là khi bạn nhấn phím enter) con trỏ máy quét di chuyển đến dòng tiếp theo và trả về dòng trước đó đã bị bỏ qua. Nó không kiểm tra xem bạn đã nhập đầy đủ thông tin đầu vào hay chưa, thậm chí nó sẽ lấy một chuỗi trống trong đó next () không lấy chuỗi trống
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();
}
}
}
Hãy thử chương trình này bằng cách thay đổi next () và nextLine () trong vòng lặp for, tiếp tục nhấn '\ n' là phím enter mà không cần bất kỳ đầu vào nào, bạn có thể thấy rằng bằng cách sử dụng phương thức nextLine (), nó kết thúc sau khi nhấn một số trường hợp nhất định trong đó như next () sẽ không kết thúc cho đến khi bạn cung cấp và nhập vào nó cho một số trường hợp nhất định.
next()
hoạt động trong thực tế, nó bỏ qua phím enter, trong khi nexLine()
chấp nhận nó là đầu vào hoàn chỉnh và nó sao chép nó sang bảng điều khiển nếu bạn lặp lại giá trị của những gì đã được ghi lại. Tôi vừa thêm System.out.println(str[i]);
dưới dạng một dòng mới bên dưới str[i]=sc.next();
hoặcstr[i]=sc.nextLine();
Điểm mấu chốt là tìm nơi phương thức sẽ dừng và con trỏ sẽ ở đâu sau khi gọi phương thức.
Tất cả các phương thức sẽ đọc thông tin không bao gồm khoảng trắng giữa vị trí con trỏ và các dấu phân cách mặc định tiếp theo (khoảng trắng, tab, \ n - được tạo bằng cách nhấn Enter). Con trỏ dừng trước các dấu phân cách ngoại trừ nextLine()
, con trỏ đọc thông tin (bao gồm khoảng trắng được tạo bởi các dấu phân cách) giữa vị trí con trỏ và \ n, đồng thời con trỏ dừng phía sau \ n.
Ví dụ, hãy xem xét minh họa sau:
|23_24_25_26_27\n
|
-> vị trí con trỏ hiện tại
_
-> khoảng trắng
stream -> Bold (thông tin nhận được bởi phương thức gọi)
Xem điều gì sẽ xảy ra khi bạn gọi các phương thức này:
nextInt()
đọc 23 | _24_25_26_27 \ n
nextDouble()
đọc 23_ 24 | _25_26_27 \ n
next()
đọc 23_24_ 25 | _26_27 \ n
nextLine()
đọc 23_24_25 _26_27 \ n |
Sau đó, phương thức sẽ được gọi tùy thuộc vào yêu cầu của bạn.
Tóm lại: nếu bạn đang nhập một mảng chuỗi có độ dài t, thì Máy quét # nextLine () sẽ yêu cầu t dòng, mỗi mục nhập trong mảng chuỗi được phân biệt với mục khác bằng phím enter. Và Máy quét # next () sẽ tiếp tục nhận đầu vào cho đến khi bạn nhấn enter nhưng lưu chuỗi (từ) bên trong mảng, được phân tách bằng khoảng trắng.
Hãy xem đoạn mã sau
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();
}
khi tôi chạy đoạn mã trên trong IDE của mình (giả sử đối với độ dài chuỗi 2), không quan trọng liệu tôi có nhập chuỗi của mình dưới dạng
Nhập dưới dạng: - abcd abcd hoặc
Đầu vào là: -
A B C D
A B C D
Đầu ra sẽ giống như abcd
A B C D
Nhưng nếu trong cùng một đoạn mã, chúng ta thay thế phương thức next () bằng 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();
}
Sau đó, nếu bạn nhập đầu vào trên dấu nhắc là - abcd abcd
Đầu ra là: -
abcd abcd
và nếu bạn nhập đầu vào trên dấu nhắc là abcd (và nếu bạn nhấn enter để nhập abcd tiếp theo ở dòng khác, dấu nhắc nhập sẽ chỉ thoát và bạn sẽ nhận được đầu ra)
Đầu ra là: -
A B C D
Của javadocs
next () Trả về mã thông báo tiếp theo nếu nó khớp với mẫu được tạo từ chuỗi được chỉ định. nextLine () Tiến bộ quét này qua dòng hiện tại và trả về đầu vào đã bị bỏ qua.
Cái nào bạn chọn phụ thuộc vào cái nào phù hợp với nhu cầu của bạn nhất. Nếu là tôi đọc toàn bộ tệp, tôi sẽ truy cập nextLine cho đến khi tôi có tất cả tệp.
Các phương thức next () và nextLine () được liên kết với Máy quét và được sử dụng để nhận đầu vào Chuỗi. Sự khác biệt của chúng là ...
next () chỉ có thể đọc đầu vào cho đến khoảng trắng. Nó không thể đọc hai từ cách nhau bởi dấu cách. Ngoài ra, next () đặt con trỏ vào cùng một dòng sau khi đọc đầu vào.
nextLine () đọc đầu vào bao gồm khoảng trắng giữa các từ (nghĩa là nó đọc cho đến cuối dòng \ n). Khi đầu vào được đọc, nextLine () định vị con trỏ ở dòng tiếp theo.
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);
}
}
Đầu ra:
nhập chuỗi cho c abc def
c là abc
nhập chuỗi cho d
d là def
Nếu bạn sử dụng nextLine () thay vì next () thì
Đầu ra:
nhập chuỗi cho c
ABC DEF
c là ABC DEF
nhập chuỗi cho d
GHI
d là GHI
Ví dụ khác về Scanner.next () và nextLine () giống như bên dưới: nextLine () không cho phép người dùng nhập trong khi next () khiến Máy quét đợi và đọc đầu vào.
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"));
Một máy quét chia đầu vào của nó thành các mã thông báo bằng cách sử dụng một mẫu dấu phân cách, theo mặc định được gọi là Khoảng trắng .
Next () dùng để đọc một từ đơn lẻ và khi nhận được khoảng trắng, nó sẽ dừng đọc và con trỏ trở lại vị trí ban đầu. NextLine () trong khi cái này đọc toàn bộ từ ngay cả khi nó gặp khoảng trắng. Con trỏ dừng lại khi nó đọc xong và con trỏ quay lại cuối dòng. do đó, u không cần phải sử dụng một delimeter khi bạn muốn đọc một từ đầy đủ như một sentence.you chỉ cần sử dụng 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);
}
Cả hai chức năng được sử dụng để chuyển sang mã thông báo Máy quét tiếp theo.
Sự khác biệt nằm ở cách mã thông báo máy quét được tạo
next () tạo mã thông báo máy quét bằng cách sử dụng dấu phân cách dưới dạng Khoảng trắng
nextLine () tạo mã thông báo máy quét bằng cách sử dụng dấu phân cách là '\ n' (tức là các lần nhấn phím Enter)
Tôi cũng gặp sự cố liên quan đến dấu phân cách. câu hỏi là tất cả về đầu vào của
Vấn đề
Giải pháp
Tôi đã sử dụng dấu phân cách cho máy quét của mình và thành công.
Thí dụ
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);
}
Sự khác biệt cơ bản là next () được sử dụng để lấy đầu vào cho đến khi gặp dấu phân cách (Theo mặc định, nó là khoảng trắng, nhưng bạn cũng có thể thay đổi nó) và trả về mã thông báo mà bạn đã nhập. Con trỏ sau đó vẫn ở trên cùng một dòng. Trong khi trong nextLine (), nó quét đầu vào cho đến khi chúng ta nhấn nút enter và trả lại toàn bộ và đặt con trỏ vào dòng tiếp theo. **
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]);
}
**
Hãy thử chạy mã này bằng cách đặt Đầu vào là "Hello World". Máy quét đọc đầu vào cho đến khi 'o' và sau đó xuất hiện dấu phân cách. Vì vậy, [0] sẽ là "Xin chào" và con trỏ sẽ trỏ đến vị trí tiếp theo sau dấu phân cách ( đó là 'W' trong trường hợp của chúng tôi) và khi s [1] được đọc, nó sẽ quét "Thế giới" và trả về s [1] như một mã thông báo hoàn chỉnh tiếp theo (theo định nghĩa của Máy quét). Nếu chúng ta sử dụng nextLine () thay vào đó, nó sẽ đọc "Hello World" đầy đủ và nhiều hơn nữa cho đến khi chúng ta nhấn nút enter và lưu trữ nó trong s [0]. Chúng tôi cũng có thể cung cấp một chuỗi khác bằng cách sử dụng nextLine (). Tôi khuyên bạn nên thử sử dụng ví dụ này và hơn thế nữa và yêu cầu làm rõ.