Arasındaki temel fark nedir next()
ve nextLine()
?
Ana hedefim, herhangi bir kaynağa (örneğin dosya) Scanner
"bağlanabilen" a kullanarak tüm metni okumaktır .
Hangisini seçmeliyim ve neden?
Yanıtlar:
Her zaman girdiyi kullanarak okumayı nextLine()
ve ardından dizeyi çözümlemeyi tercih ederim .
Kullanımı next()
yalnızca sınırlayıcıdan önce gelenleri döndürür (varsayılan olarak beyaz boşluktur). nextLine()
mevcut satırı döndürdükten sonra tarayıcıyı otomatik olarak aşağı hareket ettirir.
Verileri ayrıştırmak için yararlı bir araç nextLine()
olacaktır str.split("\\s+")
.
String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces
Scanner sınıfı veya String sınıfı hakkında daha fazla bilgi için aşağıdaki bağlantılara bakın.
Tarayıcı: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
Dize: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
BufferedReader
satır satır okumak için a kullanmıyorsunuz ? Neden Scanner
bu kadar moda olduğunu anlamıyorum .
next()
girişi yalnızca boşluğa kadar okuyabilir. Bir boşlukla ayrılmış iki kelimeyi okuyamaz. Ayrıca, next()
girişi okuduktan sonra imleci aynı satıra yerleştirir.
nextLine()
sözcükler arasındaki boşluk dahil girişi okur (yani satırın sonuna kadar okur \n
). Giriş okunduktan sonra, nextLine()
imleci sonraki satıra konumlandırır.
Tüm satırı okumak için kullanabilirsiniz nextLine()
.
JavaDoc'tan:
- Bir
Scanner
, varsayılan olarak beyaz boşluklarla eşleşen bir sınırlayıcı model kullanarak girdisini belirteçlere böler.next()
: Bu tarayıcıdan bir sonraki tam belirteci bulur ve döndürür.nextLine()
: Bu tarayıcıyı geçerli satırın ötesine ilerletir ve atlanan girişi döndürür.
Yani olması durumunda "small example<eol>text"
next()
"küçük" nextLine()
döndürmeli ve "küçük örnek" döndürmelidir
next()
dahil edilmiyor \n
?
Next () dışında fark ettiğim şey, yalnızca nextLine () tüm satırı tararken, nextLine () tam bir belirteci beklemediği için tam bir belirteç alana kadar beklediği boşluğa kadar tarıyor '\ n' elde edildiğinde (yani enter tuşuna bastığınızda) tarayıcı imleci sonraki satıra geçer ve atlanan önceki satıra geri döner. Tam girdi verip vermediğinizi kontrol etmez, boş bir dizge alsa bile next () boş dizge almaz.
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();
}
}
}
Döngüde next () ve nextLine () 'i değiştirerek bu programı deneyin, herhangi bir giriş yapmadan girmek için' \ n 'tuşuna basmaya devam edin, nextLine () yöntemini kullanarak verilen sayıda vakaya bastıktan sonra sona erdiğini olarak bir sonraki () doesnot sonlandırmak vakaların sayısı için kendisine sağladığınız e kadar ve giriş.
next()
pratikte nasıl çalıştığını gördüm , enter anahtarını görmezden geliyor, oysa nexLine()
bunu tam girdi olarak kabul ediyor ve yakalanan şeyin değerini yansıtırsanız konsola kopyalıyor. System.out.println(str[i]);
Aşağıya yeni bir satır ekledim str[i]=sc.next();
veyastr[i]=sc.nextLine();
Anahtar nokta, yöntemin nerede duracağını ve yöntemleri çağırdıktan sonra imlecin nerede olacağını bulmaktır.
Tüm yöntemler, imleç konumu ile sonraki varsayılan sınırlayıcılar (boşluk, sekme, \ n - Enter tuşuna basılarak oluşturulmuş) arasında boşluk içermeyen bilgileri okuyacaktır. nextLine()
İmleç konumu ile \ n arasındaki bilgileri (sınırlayıcılar tarafından oluşturulan beyaz boşluklar dahil) okuyan ve imleç geride \ n durduğu dışında , imleç sınırlayıcılardan önce durur.
Örneğin, aşağıdaki çizimi göz önünde bulundurun:
|23_24_25_26_27\n
|
-> mevcut imleç konumu
_
-> boşluk
stream -> Kalın (çağrı yöntemiyle elde edilen bilgiler)
Bu yöntemleri çağırdığınızda ne olduğunu görün:
nextInt()
23 | _24_25_26_27 \ n oku
nextDouble()
23_ 24 | _25_26_27 \ n oku
next()
23_24_ 25 | _26_27 \ n oku
nextLine()
23_24_25 _26_27 oku \ n |
Bundan sonra, ihtiyacınıza göre yöntem çağrılmalıdır.
Kısaca: t uzunluğunda bir dize dizisi giriyorsanız, Tarayıcı # nextLine () t satırları bekler, dize dizisindeki her giriş, enter tuşu ile diğerinden farklılaştırılır ve Tarayıcı # next (), girişleri almaya devam edecektir. enter tuşuna basarsınız, ancak dizi içinde boşlukla ayrılmış olarak dizeyi (kelime) saklar.
Aşağıdaki kod parçacığına bir göz atalım
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'mde kod parçacığının üzerinde çalıştırdığımda (dize uzunluğu 2 için diyelim), dizimi şu şekilde girip girmememin önemi yok
Şu şekilde girin: - abcd abcd veya
Giriş şekli: -
abcd
abcd
Çıktı abcd gibi olacak
abcd
Ancak aynı kodda next () yöntemini nextLine () ile değiştirirsek
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();
}
Sonra komut isteminde - abcd abcd şeklinde giriş girerseniz
Çıktı: -
abcd abcd
ve girişi abcd olarak istemde girerseniz (ve başka bir satırdaki bir sonraki abcd'yi girmek için enter tuşuna basarsanız, giriş istemi çıkacak ve çıktıyı alacaksınız)
Çıktı: -
abcd
Gönderen javadocs
next () Belirtilen dizeden oluşturulan kalıpla eşleşiyorsa sonraki simgeyi döndürür. nextLine () Bu tarayıcıyı geçerli satırın ötesine ilerletir ve atlanan girişi döndürür.
Hangisini seçeceğiniz, hangisinin ihtiyaçlarınıza en uygun olduğuna bağlıdır. Ben olsam bütün dosyayı okursam, tüm dosyayı alana kadar nextLine'a giderdim.
Tarayıcı belgelerinden :
Tarayıcı, girişini, varsayılan olarak beyaz boşlukla eşleşen bir sınırlayıcı desen kullanarak belirteçlere böler .
Sonraki () için belgelerden :
Tam bir belirtecin önünde ve ardından sınırlayıcı modelle eşleşen giriş gelir.
next () ve nextLine () yöntemleri Tarayıcı ile ilişkilendirilir ve String girdileri almak için kullanılır. Farklılıkları ...
next () girdiyi yalnızca boşluğa kadar okuyabilir. Boşluklarla ayrılmış iki kelimeyi okuyamaz. Ayrıca next (), girişi okuduktan sonra imleci aynı satıra yerleştirir.
nextLine (), sözcükler arasındaki boşluk dahil girişi okur (yani, satırın sonuna kadar okur \ n). Giriş okunduğunda, nextLine () imleci sonraki satıra konumlandırır.
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);
}
}
Çıktı:
c abc için dize girin def
c abc
d için dize girin
d def
Next () yerine nextLine () kullanırsanız
Çıktı:
c için dize girin
ABC DEF
c, ABC DEF
d için dize girin
GHI
d, GHI'dir
Scanner.next () ve nextLine () 'nin başka bir örneği, aşağıdaki gibidir: nextLine (), Scanner'ın beklemesini ve girdiyi okumasını sağlarken, nextLine () kullanıcının yazmasına izin vermez.
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"));
Bir tarayıcı , girdisini, varsayılan olarak Beyaz boşluklar olarak bilinen bir sınırlayıcı model kullanarak jetonlara böler .
Next () tek bir kelimeyi okumak için kullanır ve beyaz bir boşluk olduğunda, okumayı durdurur ve imleci orijinal konumuna geri döndürür. NextLine () bir boşlukla karşılaştığında bile tüm bir kelimeyi okurken, imleç okumayı bitirdiğinde durur ve imleç satırın sonuna geri döner. u kullanmaya gerek kalmaz delimeter sen sentence.you sadece nextLine kullanmaya gerek bir şekilde tam bir kelimeyi okumak istediğinizde ().
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);
}
Her iki işlev de bir sonraki Tarayıcı jetonuna geçmek için kullanılır.
Aradaki fark, tarayıcı jetonunun nasıl oluşturulduğuna bağlıdır
next () ayırıcıyı Beyaz Boşluk olarak kullanarak tarayıcı belirteçleri üretir
nextLine (), sınırlayıcıyı '\ n' olarak kullanarak tarayıcı jetonları üretir (yani, tuşa basılması)
Sınırlayıcıyla ilgili bir sorunum da var. soru tüm girdiler hakkındaydı
Sorun
Çözüm
Tarayıcım için sınırlayıcıyı kullandım ve başarılı bir şekilde çıktım.
Misal
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);
}
Temel fark next (), sınırlayıcıyla karşılaşılıncaya kadar girdiyi almak için kullanılır (varsayılan olarak beyaz boşluktur, ancak bunu değiştirebilirsiniz) ve girdiğiniz jetonu döndürür. İmleç daha sonra Aynı satırda kalır. NextLine () ise, biz enter düğmesine basana kadar girişi tarar ve her şeyi döndürür ve imleci sonraki satıra yerleştirir. **
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]);
}
**
Giriş'i "Merhaba Dünya" olarak vererek bu kodu çalıştırmayı deneyin. Tarayıcı, girişi 'o'ya kadar okur ve ardından bir sınırlayıcı oluşur. Yani s [0], "Merhaba" olur ve imleç, sınırlayıcıdan sonraki konumu gösterecektir ( bu bizim durumumuzda 'W' dır) ve s [1] okunduğunda, "Dünya" yı tarar ve onu bir sonraki tam simge olarak s [1] 'e döndürür (Tarayıcı tanımına göre). nextLine () kullanırsak bunun yerine "Merhaba Dünya" yı tam olarak okuyacak ve ayrıca biz enter düğmesine basıp s [0] 'da saklayana kadar daha fazlasını okuyacaktır. NextLine () kullanarak da başka bir dizge verebiliriz. Bu örneği ve daha fazlasını kullanmayı denemenizi ve herhangi bir açıklama istemenizi tavsiye ederim.