Jaka jest różnica między metodami next () i nextLine () z klasy Scanner?


Odpowiedzi:


86

Zawsze wolę czytać dane wejściowe za pomocą, nextLine()a następnie analizować ciąg.

Użycie next()zwróci tylko to, co znajduje się przed ogranicznikiem (domyślnie jest to biały znak). nextLine()automatycznie przesuwa skaner w dół po zwróceniu bieżącej linii.

Przydatnym narzędziem do analizowania danych z nextLine()byłoby str.split("\\s+").

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

Aby uzyskać więcej informacji na temat klasy Scanner lub klasy String, skorzystaj z poniższych łączy.

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

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


5
Dlaczego więc nie użyć po prostu znaku BufferedReaderdo czytania wiersz po wierszu? Nie rozumiem, dlaczego Scannerjest w takiej modzie.
David Conrad

7
@DavidConrad "Jaka jest różnica między metodami next () i nextLine () z klasy Scanner?"
Tristan

4
Tak, zdaję sobie sprawę, o to pytał OP. Zastanawiałem się tylko, skoro mówisz, że „zawsze wolisz” używać nextLine.
David Conrad

Możesz bezpiecznie wykonać nextLine (), a następnie utworzyć nowy Scanner tylko dla tej linii. Klasa Scanner może skanować ciągi znaków: new Scanner (new Scanner (System.in) .nextLine ()).
axell13

48

next()może odczytać wejście tylko do spacji. Nie może czytać dwóch słów oddzielonych spacją. Ponadto next()umieszcza kursor w tej samej linii po przeczytaniu wejścia.

nextLine()czyta dane wejściowe wraz ze spacjami między słowami (to znaczy czyta do końca wiersza \n). Po przeczytaniu wejścia nextLine()ustawia kursor w następnym wierszu.

Do czytania całej linii możesz użyć nextLine().


@LuiggiMendoza Masz na myśli formatowanie, a nie formalne pisanie?
Det

next () może czytać dane wejściowe tylko do białych znaków . Nie może czytać dwóch słów oddzielonych białą spacją . białe znaki zawierają spację, tabulator i wysuw wiersza
Fred Hu

19

Z JavaDoc:

  • A Scannerdzieli dane wejściowe na tokeny za pomocą wzorca ogranicznika, który domyślnie dopasowuje białe znaki.
  • next(): Znajduje i zwraca następny kompletny token z tego skanera.
  • nextLine(): Przesuwa ten skaner poza bieżącą linię i zwraca dane wejściowe, które zostały pominięte.

Więc w przypadku "small example<eol>text" next()powinien zwrócić „mały” i nextLine()powinien zwrócić „mały przykład”


1
dlaczego nie next()obejmują \nw zwrócony tokenu ??
rimalroshan

2
To jest pytanie do projektantów Java API, albo opublikuj pytanie na SO i może ktoś wie dlaczego.
Oleg Sklyar

10

Zauważyłem, że oprócz next () skanuje tylko do miejsca, gdzie nextLine () skanuje całą linię, że next czeka aż otrzyma kompletny token, gdzie nextLine () nie czeka na kompletny token, kiedy kiedykolwiek '\ n' (tj. po naciśnięciu klawisza Enter) kursor skanera przesuwa się do następnej linii i zwraca poprzednią pominiętą linię. Nie sprawdza, czy podałeś pełne dane wejściowe, czy nie, nawet weźmie pusty ciąg, gdzie jako next () nie przyjmuje pustego ciągu

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

}

Wypróbuj ten program, zmieniając next () i nextLine () w pętli for, idź dalej wciskając '\ n', czyli klawisz enter bez żadnego wejścia, możesz zauważyć, że używając metody nextLine () kończy się po naciśnięciu określonej liczby przypadków, gdzie as next () nie kończy się, dopóki nie podasz i nie wprowadzisz do niej danych dla podanej liczby przypadków.


1
Bardzo ciekawy przykład. Uruchamiając kod w końcu zobaczyłem, jak next()działa w praktyce, ignoruje on klawisz enter, podczas gdy nexLine()akceptuje go jako pełne dane wejściowe i replikuje go do konsoli, jeśli powtórzysz wartość tego, co zostało przechwycone. Właśnie dodałem System.out.println(str[i]);jako nową linię poniżej str[i]=sc.next();lubstr[i]=sc.nextLine();
Pablo Adames

@PabloAdames wdzięczni, jeśli możesz zagłosować za odpowiedzią, jeśli tak chcesz
murali krish

9

Kluczową kwestią jest znalezienie, gdzie metoda się zatrzyma i gdzie będzie kursor po wywołaniu metod.

Wszystkie metody odczytują informacje, które nie zawierają białych znaków między pozycją kursora a następnymi domyślnymi ogranicznikami (spacja, tabulator, \ n - utworzone przez naciśnięcie klawisza Enter). Kursor zatrzymuje się przed ogranicznikami, z wyjątkiem nextLine(), który odczytuje informacje (w tym spacje utworzone przez separatory) między pozycją kursora a \ n, a kursor zatrzymuje się za \ n.


Weźmy na przykład pod uwagę następującą ilustrację:

|23_24_25_26_27\n

| -> aktualna pozycja kursora

_ -> spacje

strumień -> Bold (informacja uzyskana przez metodę wywołującą)

Zobacz, co się stanie, gdy wywołasz te metody:

nextInt()    

przeczytaj 23 | _24_25_26_27 \ n

nextDouble()

przeczytaj 23_ 24 | _25_26_27 \ n

next()

przeczytaj 23_24_ 25 | _26_27 \ n

nextLine()

przeczytaj 23_24_25 _26_27 \ n |


Następnie metodę należy wywołać w zależności od wymagań.


2
taka niedoceniana odpowiedź. wszystko inne jest nieco mylące
csguy

3

W skrócie: jeśli wprowadzasz tablicę ciągów o długości t, to Scanner # nextLine () oczekuje t wierszy, każdy wpis w tablicy ciągów jest odróżniany od innych za pomocą klawisza enter, a Scanner # next () będzie pobierał dane wejściowe do naciskasz enter, ale przechowuje ciąg (słowo) wewnątrz tablicy, który jest oddzielony białymi znakami.

Przyjrzyjmy się poniższemu fragmentowi kodu

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

kiedy uruchomię powyższy fragment kodu w moim IDE (powiedzmy dla ciągu o długości 2), nie ma znaczenia, czy wprowadzę swój ciąg jako

Wprowadź jako: - abcd abcd lub

Wprowadź jako: -

abcd

abcd

Wynik będzie podobny do abcd

abcd

Ale jeśli w tym samym kodzie zamienimy metodę next () na 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();
    }

Następnie, jeśli wprowadzisz dane wejściowe jako - abcd abcd

Wynik to: -

abcd abcd

a jeśli wprowadzisz dane wejściowe po znaku zachęty jako abcd (i jeśli naciśniesz Enter, aby wprowadzić następny abcd w innej linii, znak zachęty zostanie po prostu zakończony i otrzymasz wynik)

Wynik to: -

abcd


2

Od javadocs

next () Zwraca następny token, jeśli pasuje do wzorca zbudowanego z określonego ciągu. nextLine () Przesuwa ten skaner poza bieżącą linię i zwraca dane wejściowe, które zostały pominięte.

To, który wybierzesz, zależy od tego, który najlepiej odpowiada Twoim potrzebom. Gdybym czytał cały plik, przechodziłbym do nextLine, dopóki nie miałbym całego pliku.


1

Z dokumentacji skanera :

Skaner dzieli swoje dane wejściowe na tokeny za pomocą wzorca separatora, który domyślnie dopasowuje białe znaki.

Z dokumentacji dla next () :

Kompletny token jest poprzedzony i zakończony danymi wejściowymi, które pasują do wzorca ogranicznika.


1

Metody next () i nextLine () są powiązane ze skanerem i są używane do pobierania danych wejściowych typu String. Ich różnice są ...

next () może czytać dane wejściowe tylko do spacji. Nie może czytać dwóch słów oddzielonych spacją. Ponadto next () umieszcza kursor w tym samym wierszu po przeczytaniu wejścia.

nextLine () czyta dane wejściowe wraz ze spacjami między słowami (to znaczy czyta do końca wiersza \ n). Po odczytaniu wejścia metoda nextLine () umieszcza kursor w następnej linii.

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

Wynik:

wprowadź ciąg dla c abc def
c is abc

wprowadź ciąg dla d

d jest pok

Jeśli używasz nextLine () zamiast next () to

Wynik:

wprowadź ciąg dla c

ABC DEF
c to ABC DEF
wprowadź ciąg dla d

GHI
d to GHI


1
  • Kolejny przykład Scanner.next () i nextLine () jest taki jak poniżej: nextLine () nie pozwala użytkownikowi pisać, podczas gdy next () sprawia, że ​​Scanner czeka i odczytuje dane wejściowe.

     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

Skaner dzieli dane wejściowe na tokeny za pomocą wzorca ogranicznika, który jest domyślnie nazywany białymi znakami .

Next () używa do odczytania pojedynczego słowa, a kiedy pojawi się spacja, przestaje czytać, a kursor wraca do pierwotnej pozycji. NextLine (), podczas gdy ten czyta całe słowo, nawet jeśli napotka białe znaki. Kursor zatrzymuje się, gdy kończy czytanie, a kursor wraca do końca wiersza. więc nie musisz używać separatora, gdy chcesz odczytać całe słowo jako zdanie. wystarczy użyć 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

Obie funkcje służą do przejścia do następnego tokena skanera.

Różnica polega na sposobie generowania tokena skanera

next () generuje tokeny skanera, używając separatora jako białego spacji

nextLine () generuje tokeny skanera, używając separatora jako '\ n' (tj. naciśnij klawisz Enter)


0

Mam też problem z separatorem. pytanie dotyczyło tylko danych wejściowych

  1. Wpisz swoje imię.
  2. Wpisz swój wiek.
  3. Wprowadź swój email.
  4. wprowadź swój adres.

Problem

  1. Skończyłem pomyślnie, podając imię i nazwisko, wiek i adres e-mail.
  2. Kiedy wymyśliłem adres dwóch słów z białą spacją (ulica Harnet), właśnie otrzymałem pierwszy z nich „harnet”.

Rozwiązanie

Użyłem ogranicznika do mojego skanera i wyszedłem pomyślnie.

Przykład

 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

Podstawowa różnica polega na tym, że metoda next () służy do pobierania danych wejściowych do momentu napotkania separatora (domyślnie jest to spacja, ale można go również zmienić) i zwraca wprowadzony token, a kursor pozostaje w tej samej linii. Podczas gdy w nextLine () skanuje dane wejściowe do momentu naciśnięcia klawisza enter i zwrócenia całości i umieszczenia kursora w następnej linii. **

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

**

Spróbuj uruchomić ten kod, podając dane wejściowe jako „Hello World”. Skaner czyta dane wejściowe do „o”, a następnie pojawia się separator. Więc s [0] będzie „Hello”, a kursor będzie wskazywał następną pozycję po separatorze ( czyli 'W' w naszym przypadku), a kiedy s [1] zostanie odczytane, skanuje "Świat" i zwraca go do s [1] jako następny kompletny token (zgodnie z definicją Scanner). Jeśli użyjemy nextLine () Zamiast tego odczyta „Hello World” w całości, a także więcej, dopóki nie naciśniemy przycisku Enter i nie zapiszemy go w s [0]. Możemy również podać inny napis używając nextLine (). Polecam skorzystać z tego i nie tylko tego przykładu i poprosić o wyjaśnienia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.