Scanner sınıfından next () ve nextLine () yöntemleri arasındaki fark nedir?


89

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?


Bu size yardımcı olabilir [
Scanner.nextLine

Yanıtlar:


86

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


5
Öyleyse, neden BufferedReadersatır satır okumak için a kullanmıyorsunuz ? Neden Scannerbu kadar moda olduğunu anlamıyorum .
David Conrad

7
@DavidConrad "Scanner sınıfından next () ve nextLine () yöntemleri arasındaki fark nedir?"
Tristan

4
Evet, OP'nin sorduğu şeyin bu olduğunu anlıyorum, nextLine'ı kullanmayı "her zaman tercih ettiğinizi" söylediğiniz için merak ediyordum.
David Conrad

Bir nextLine () işlemini güvenli bir şekilde yapabilir ve ardından yalnızca bu satır için yeni bir Tarayıcı oluşturabilirsiniz. Tarayıcı sınıfı dizeleri tarayabilir: new Scanner (new Scanner (System.in) .nextLine ()).
axell13

48

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


@LuiggiMendoza biçimlendirmeyi mi kastediyorsunuz, resmi yazı değil mi?
Det

next () girdiyi yalnızca beyaz alana kadar okuyabilir . Bir boşlukla ayrılmış iki kelimeyi okuyamaz . boşluk , boşluk, sekme ve satır besleme içerir
Fred Hu

19

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


1
neden döndürülen jetona next()dahil edilmiyor \n?
rimalroshan

2
Bu, Java API tasarımcılarına bir sorudur veya SO'da bir soru yayınlar ve belki birileri nedenini biliyordur.
Oleg Sklyar

10

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


1
Çok ilginç bir örnek. Kodu çalıştırdığımda nihayet 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();
Pablo Adames

Cevaba olumlu oy verebilirseniz @PabloAdames, beğenirseniz teşekkür ederiz
murali krish

9

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.


2
böyle küçümsenmemiş bir cevap. diğer her şey biraz yanıltıcı
csguy

3

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


2

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.


1

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.


1

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


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

1

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

1

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ı)


0

Sınırlayıcıyla ilgili bir sorunum da var. soru tüm girdiler hakkındaydı

  1. adınızı giriniz.
  2. yaşınızı girin.
  3. E-postanızı giriniz.
  4. adresinizi girin.

Sorun

  1. İsim, yaş ve e-posta ile başarılı bir şekilde bitirdim.
  2. Ben sahip iki kelimenin adresi ile geldi boşluk (eşekarısı sokak) Ben sadece ilkini "eşekarısı" var.

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

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.