Apa perbedaan utama antara next()
dan nextLine()
?
Tujuan utama saya adalah membaca semua teks menggunakan Scanner
yang mungkin "terhubung" ke sumber manapun (file misalnya).
Mana yang harus saya pilih dan mengapa?
java
java.util.scanner
AnnieOK
sumber
sumber
Jawaban:
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 menjadistr.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
sumber
BufferedReader
untuk membaca baris demi baris? Saya tidak mengerti mengapaScanner
mode seperti itu.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()
.sumber
Dari JavaDoc:
Jadi dalam kasus
"small example<eol>text"
next()
harus mengembalikan "kecil" dannextLine()
harus mengembalikan "contoh kecil"sumber
next()
menyertakan\n
dalam token yang dikembalikan ??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.
sumber
next()
kerjanya dalam praktik, itu mengabaikan tombol enter, sedangkannexLine()
menerimanya sebagai input lengkap dan mereplikasi ke konsol jika Anda menggemakan nilai dari apa yang ditangkap. Saya baru saja menambahkanSystem.out.println(str[i]);
sebagai baris baru di bawahstr[i]=sc.next();
ataustr[i]=sc.nextLine();
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_
-> spasistream -> Bold (informasi yang didapat dari metode panggilan)
Lihat apa yang terjadi jika Anda memanggil metode ini:
baca 23 | _24_25_26_27 \ n
baca 23_ 24 | _25_26_27 \ n
baca 23_24_ 25 | _26_27 \ n
membaca 23_24_25 _26_27 \ n |
Setelah ini, metode harus dipanggil tergantung pada kebutuhan Anda.
sumber
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
sumber
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.
sumber
Dari dokumentasi untuk Scanner :
Dari dokumentasi untuk next () :
sumber
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
sumber
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"));
sumber
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); }
sumber
Kedua fungsi tersebut digunakan untuk berpindah ke token Scanner berikutnya.
Perbedaannya terletak pada bagaimana token pemindai dibuat
sumber
Saya juga mendapat masalah tentang pembatas. pertanyaannya adalah tentang masukan dari
Masalah
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); }
sumber
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.
sumber