Sự khác biệt giữa phương thức next () và nextLine () từ lớp Scanner là gì?


87

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 Scannercó 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?


Điều này có thể giúp bạn [Sử dụng scanner.nextLine ()] [1]: stackoverflow.com/questions/5032356/using-scanner-nextline
Milaci

Câu trả lời:


86

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


5
Vì vậy, tại sao không chỉ sử dụng một BufferedReaderđể đọc từng dòng? Tôi không hiểu tại sao lại Scannerthịnh hành như vậy.
David Conrad

7
@DavidConrad "Sự khác biệt giữa phương thức next () và nextLine () từ lớp Scanner là gì?"
Tristan

4
Vâng, tôi nhận ra đó là những gì OP đang hỏi, tôi chỉ băn khoăn vì bạn nói rằng bạn "luôn thích" sử dụng nextLine.
David Conrad,

Bạn có thể thực hiện một cách an toàn nextLine () và sau đó tạo một Máy quét mới chỉ cho dòng đó. Lớp Máy quét có thể quét các chuỗi: Máy quét mới (Máy quét mới (System.in) .nextLine ()).
axell13

47

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() .


@LuiggiMendoza bạn có nghĩa là định dạng, không phải văn bản chính thức?
Det

next () chỉ có thể đọc đầu vào cho đến khi có khoảng trắng . Nó không thể đọc hai từ được phân tách bằng khoảng trắng . khoảng trắng bao gồm khoảng trắng , tab và nguồn cấp dữ liệu
Fred Hu

19

Từ JavaDoc:

  • A Scannerngắ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ỏ"


1
tại sao không next()bao gồm \ntrong mã thông báo trả lại ??
rimalroshan

2
Đây là một câu hỏi cho các nhà thiết kế Java API, hoặc đăng một câu hỏi trên SO và có thể ai đó biết tại sao.
Oleg Sklyar

10

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.


1
Ví dụ rất thú vị. Chạy mã cuối cùng tôi đã thấy cách 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();
Pablo Adames 29/09/19

@PabloAdames đánh giá cao nếu bạn có thể upvote nếu câu trả lời nếu bạn thích để
Krish Murali

9

Đ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.


2
một câu trả lời được đánh giá thấp như vậy. mọi thứ khác hơi sai lệch
csguy

3

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


2

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.


1

Từ tài liệu dành cho Máy qué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ẫu dấu phân cách, theo mặc định sẽ khớp với khoảng trắng.

Từ tài liệu cho next () :

Mã thông báo hoàn chỉnh được đặt trước và theo sau bởi đầu vào phù hợp với mẫu dấu phân cách.


1

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


1
  • 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"));
    

1

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

1

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)


0

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

  1. nhập tên của bạn.
  2. nhập tuổi của bạn.
  3. nhập email của bạn.
  4. nhập địa chỉ của bạn.

Vấn đề

  1. Tôi đã hoàn thành thành công với tên, tuổi và email.
  2. Khi tôi tìm ra địa chỉ của hai từ có khoảng trắng (đường Harnet), tôi chỉ nhận được từ đầu tiên "harnet".

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

0

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õ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.