Apa perbedaan antara metode next () dan nextLine () dari kelas Scanner?

89

Apa perbedaan utama antara next()dan nextLine()?
Tujuan utama saya adalah membaca semua teks menggunakan Scanneryang mungkin "terhubung" ke sumber manapun (file misalnya).

Mana yang harus saya pilih dan mengapa?

AnnieOK
sumber
Ini dapat membantu Anda [Menggunakan scanner.nextLine ()] [1]: stackoverflow.com/questions/5032356/using-scanner-nextline
Milaci

Jawaban:

86

Saya selalu lebih suka membaca input menggunakan nextLine()dan kemudian mengurai string.

Menggunakan next()hanya akan mengembalikan apa yang muncul sebelum pembatas (default ke spasi). nextLine()secara otomatis memindahkan pemindai ke bawah setelah mengembalikan baris saat ini.

Alat yang berguna untuk mengurai data dari nextLine()akan menjadi str.split("\\s+").

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

Untuk informasi lebih lanjut mengenai kelas Scanner atau kelas String lihat link berikut.

Pemindai: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

String: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

Tristan
sumber
5
Jadi, mengapa tidak menggunakan a BufferedReaderuntuk membaca baris demi baris? Saya tidak mengerti mengapa Scannermode seperti itu.
David Conrad
7
@DavidConrad "Apa perbedaan antara metode next () dan nextLine () dari kelas Scanner?"
Tristan
4
Ya, saya menyadari itulah yang ditanyakan OP, saya hanya ingin tahu karena Anda mengatakan Anda "selalu lebih suka" menggunakan nextLine.
David Conrad
Anda dapat dengan aman melakukan nextLine () dan kemudian membuat Scanner baru hanya untuk baris itu. Kelas Scanner dapat memindai string: Scanner baru (new Scanner (System.in) .nextLine ()).
axell13
48

next()dapat membaca masukan hanya sampai spasi. Itu tidak bisa membaca dua kata yang dipisahkan oleh spasi. Juga, next()letakkan kursor di baris yang sama setelah membaca input.

nextLine()membaca masukan termasuk spasi di antara kata-kata (yaitu, membaca sampai akhir baris \n). Setelah input dibaca, nextLine()letakkan kursor di baris berikutnya.

Untuk membaca seluruh baris, Anda dapat menggunakan nextLine().

RKC
sumber
@LuiggiMendoza maksud Anda pemformatan, bukan tulisan formal?
Deteksi
next () hanya dapat membaca masukan hingga spasi . Itu tidak bisa membaca dua kata yang dipisahkan oleh spasi . spasi kosong termasuk spasi, tab dan umpan baris
Fred Hu
19

Dari JavaDoc:

  • A Scannermemecah masukannya menjadi token menggunakan pola pembatas, yang secara default cocok dengan spasi.
  • next(): Menemukan dan mengembalikan token lengkap berikutnya dari pemindai ini.
  • nextLine(): Memajukan pemindai ini melewati baris saat ini dan mengembalikan masukan yang telah dilewati.

Jadi dalam kasus "small example<eol>text" next()harus mengembalikan "kecil" dan nextLine()harus mengembalikan "contoh kecil"

Oleg Sklyar
sumber
1
mengapa tidak next()menyertakan \ndalam token yang dikembalikan ??
rimalroshan
2
Ini adalah pertanyaan untuk desainer Java API, atau posting pertanyaan tentang SO dan mungkin ada yang tahu mengapa.
Oleg Sklyar
10

Apa yang saya perhatikan selain next () hanya memindai hingga ruang di mana nextLine () memindai seluruh baris adalah bahwa selanjutnya menunggu sampai mendapat token lengkap dimana nextLine () tidak menunggu token lengkap, kapan pun '\ n' diperoleh (yaitu saat Anda menekan tombol enter) kursor pemindai bergerak ke baris berikutnya dan mengembalikan baris sebelumnya yang dilewati. Itu tidak memeriksa apakah Anda telah memberikan input lengkap atau tidak, bahkan akan mengambil string kosong dimana next () tidak mengambil string kosong

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

}

Coba program ini dengan mengubah loop berikutnya () dan nextLine (), lanjutkan dengan menekan '\ n' yaitu tombol enter tanpa masukan apa pun, Anda dapat menemukan bahwa menggunakan metode nextLine () ia berhenti setelah menekan sejumlah kasus di mana karena next () tidak berhenti sampai Anda memberikan dan memasukkannya untuk sejumlah kasus.

murali krish
sumber
1
Contoh yang sangat menarik. Menjalankan kode Saya akhirnya melihat cara next()kerjanya dalam praktik, itu mengabaikan tombol enter, sedangkan nexLine()menerimanya sebagai input lengkap dan mereplikasi ke konsol jika Anda menggemakan nilai dari apa yang ditangkap. Saya baru saja menambahkan System.out.println(str[i]);sebagai baris baru di bawah str[i]=sc.next();ataustr[i]=sc.nextLine();
Pablo Adames
@PabloAdames menghargai jika Anda dapat memberi suara positif jika jawabannya jika Anda suka begitu
murali krish
9

Poin utamanya adalah menemukan di mana metode akan berhenti dan di mana kursor berada setelah memanggil metode.

Semua metode akan membaca informasi yang tidak menyertakan spasi antara posisi kursor dan pembatas default berikutnya (spasi, tab, \ n - dibuat dengan menekan Enter). Kursor berhenti sebelum pemisah kecuali untuk nextLine(), yang membaca informasi (termasuk spasi yang dibuat oleh pemisah) antara posisi kursor dan \ n, dan kursor berhenti di belakang \ n.


Misalnya, perhatikan ilustrasi berikut:

|23_24_25_26_27\n

| -> posisi kursor saat ini

_ -> spasi

stream -> Bold (informasi yang didapat dari metode panggilan)

Lihat apa yang terjadi jika Anda memanggil metode ini:

nextInt()    

baca 23 | _24_25_26_27 \ n

nextDouble()

baca 23_ 24 | _25_26_27 \ n

next()

baca 23_24_ 25 | _26_27 \ n

nextLine()

membaca 23_24_25 _26_27 \ n |


Setelah ini, metode harus dipanggil tergantung pada kebutuhan Anda.

Z. Zhang
sumber
2
jawaban yang diremehkan. yang lainnya sedikit menyesatkan
csguy
3

Singkatnya: jika Anda memasukkan array string dengan panjang t, maka Scanner # nextLine () mengharapkan t baris, setiap entri dalam array string dibedakan dari yang lain dengan tombol enter. Dan Scanner # next () akan terus mengambil input sampai Anda menekan enter tetapi menyimpan string (kata) di dalam larik, yang dipisahkan oleh spasi.

Mari kita lihat cuplikan kode berikut

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

ketika saya menjalankan cuplikan kode di atas dalam IDE saya (katakanlah untuk panjang string 2), tidak masalah apakah saya memasukkan string saya sebagai

Masukan sebagai: - abcd abcd atau

Masukan sebagai: -

abcd

abcd

Outputnya akan seperti abcd

abcd

Tetapi jika dalam kode yang sama kita mengganti metode next () dengan 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();
    }

Kemudian jika Anda memasukkan input pada prompt sebagai - abcd abcd

Outputnya adalah: -

abcd abcd

dan jika Anda memasukkan input pada prompt sebagai abcd (dan jika Anda menekan enter untuk masuk ke abcd berikutnya di baris lain, prompt input hanya akan keluar dan Anda akan mendapatkan output)

Outputnya adalah: -

abcd

himani1349
sumber
2

Dari javadocs

next () Mengembalikan token berikutnya jika cocok dengan pola yang dibangun dari string yang ditentukan. nextLine () Memajukan pemindai ini melewati baris saat ini dan mengembalikan input yang dilewati.

Yang mana yang Anda pilih tergantung mana yang paling sesuai dengan kebutuhan Anda. Jika saya membaca seluruh file, saya akan memilih baris berikutnya sampai saya memiliki semua file.

onesixtyfourth
sumber
1

Dari dokumentasi untuk Scanner :

Pemindai memecah inputnya menjadi token menggunakan pola pembatas, yang secara default cocok dengan spasi.

Dari dokumentasi untuk next () :

Token lengkap diawali dan diikuti dengan masukan yang cocok dengan pola pembatas.

Foobar
sumber
1

Metode next () dan nextLine () dikaitkan dengan Scanner dan digunakan untuk mendapatkan input String. Perbedaan mereka adalah ...

next () hanya dapat membaca input hingga spasi. Itu tidak bisa membaca dua kata yang dipisahkan oleh spasi. Selain itu, next () menempatkan kursor di baris yang sama setelah membaca input.

nextLine () membaca input termasuk spasi di antara kata-kata (yaitu, membaca hingga akhir baris \ n). Setelah input dibaca, nextLine () memposisikan kursor di baris berikutnya.

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

Keluaran:

masukkan string untuk c abc def
c adalah abc

masukkan string untuk d

d adalah def

Jika Anda menggunakan nextLine () dan bukan next () lalu

Keluaran:

masukkan string untuk c

ABC DEF
c adalah ABC DEF
masukkan string untuk d

GHI
d adalah GHI

Musaddique
sumber
1
  • Contoh lain dari Scanner.next () dan nextLine () adalah seperti di bawah ini: nextLine () tidak mengizinkan pengguna mengetik sementara next () membuat Scanner menunggu dan membaca input.

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

Pemindai memecah inputnya menjadi token menggunakan pola pembatas, yang secara default dikenal sebagai Spasi Putih .

Next () menggunakan untuk membaca satu kata dan ketika mendapat spasi, ia berhenti membaca dan kursor kembali ke posisi semula. NextLine () sementara ini membaca seluruh kata bahkan ketika memenuhi spasi. Kursor berhenti ketika selesai membaca dan kursor kembali ke akhir baris. jadi Anda tidak perlu menggunakan delimeter ketika Anda ingin membaca kata lengkap sebagai kalimat. Anda hanya perlu menggunakan 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);
       }
Negash
sumber
1

Kedua fungsi tersebut digunakan untuk berpindah ke token Scanner berikutnya.

Perbedaannya terletak pada bagaimana token pemindai dibuat

next () menghasilkan token pemindai menggunakan pembatas sebagai Spasi Putih

nextLine () menghasilkan token pemindai menggunakan pembatas sebagai '\ n' (yaitu Memasukkan penekanan tombol)

Aditya Rewari
sumber
0

Saya juga mendapat masalah tentang pembatas. pertanyaannya adalah tentang masukan dari

  1. masukkan nama Anda.
  2. Masukkan Umur anda.
  3. Masukkan email Anda.
  4. masukkan alamat anda.

Masalah

  1. Saya berhasil menyelesaikan dengan nama, umur, dan email.
  2. Ketika saya menemukan alamat dua kata yang memiliki spasi putih (jalan Harnet), saya baru saja mendapat yang pertama "harnet".

Solusinya

Saya menggunakan pembatas untuk pemindai saya dan berhasil keluar.

Contoh

 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);
}
Negash
sumber
0

Perbedaan mendasarnya adalah next () digunakan untuk mendapatkan input sampai pembatas ditemukan (Secara default adalah spasi, tetapi Anda juga dapat mengubahnya) dan mengembalikan token yang telah Anda masukkan. Kursor kemudian tetap berada di baris yang sama. Sedangkan di nextLine () memindai input sampai kita menekan tombol enter dan mengembalikan semuanya dan menempatkan kursor di baris berikutnya. **

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

**

Coba jalankan kode ini dengan memberikan Input sebagai "Hello World". Pemindai membaca input hingga 'o' dan kemudian terjadi pemisah. Jadi [0] akan menjadi "Halo" dan kursor akan menunjuk ke posisi berikutnya setelah pembatas ( yaitu 'W' dalam kasus kami), dan ketika s [1] dibaca memindai "Dunia" dan mengembalikannya ke s [1] sebagai token lengkap berikutnya (menurut definisi Scanner). Jika kita menggunakan nextLine () sebagai gantinya, ia akan membaca "Hello World" sepenuhnya dan juga lebih banyak lagi sampai kita menekan tombol enter dan menyimpannya di s [0]. Kami juga dapat memberikan string lain dengan menggunakan nextLine (). Saya menyarankan Anda untuk mencoba menggunakan contoh ini dan lebih banyak lagi dan meminta klarifikasi apa pun.

Coder Sederhana
sumber