Was ist der Unterschied zwischen den Methoden next () und nextLine () aus der Scannerklasse?

86

Was ist der Hauptunterschied zwischen next()und nextLine()?
Mein Hauptziel ist es, den gesamten Text mit einem zu lesen, der mit einer beliebigen Quelle (z. B. einer Datei) Scanner"verbunden" sein kann .

Welches soll ich wählen und warum?

AnnieOK
quelle
Dies kann Ihnen helfen [Verwenden von scanner.nextLine ()] [1]: stackoverflow.com/questions/5032356/using-scanner-nextline
Milaci

Antworten:

86

Ich lese immer lieber Eingaben mit nextLine()und analysiere dann den String.

Mit using next()wird nur das zurückgegeben, was vor dem Trennzeichen steht (standardmäßig Leerzeichen). nextLine()Bewegt den Scanner automatisch nach unten, nachdem die aktuelle Zeile zurückgegeben wurde.

Ein nützliches Tool zum Parsen von Daten nextLine()wäre str.split("\\s+").

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

Weitere Informationen zur Scanner- oder String-Klasse finden Sie unter den folgenden Links.

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

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

Tristan
quelle
5
Warum also nicht einfach a verwenden BufferedReader, um Zeile für Zeile zu lesen? Ich verstehe nicht, warum Scannerdas so angesagt ist.
David Conrad
7
@DavidConrad "Was ist der Unterschied zwischen den Methoden next () und nextLine () aus der Scannerklasse?"
Tristan
4
Ja, mir ist klar, dass das OP danach gefragt hat. Ich habe mich nur gefragt, da Sie sagen, dass Sie "immer die nächste Linie bevorzugen".
David Conrad
Sie können sicher eine nextLine () ausführen und dann einen neuen Scanner nur für diese Zeile erstellen. Die Scannerklasse kann Zeichenfolgen scannen: neuer Scanner (neuer Scanner (System.in) .nextLine ()).
Axell13
47

next()kann die Eingabe nur bis zum Leerzeichen lesen. Es kann keine zwei durch ein Leerzeichen getrennten Wörter lesen. Außerdem next()stellt den Cursor in der gleichen Zeile nach dem Eingang zu lesen.

nextLine()Liest die Eingabe einschließlich des Leerzeichens zwischen den Wörtern (dh sie liest bis zum Zeilenende \n). Sobald die Eingabe gelesen wurde, nextLine()positioniert sich der Cursor in der nächsten Zeile.

Zum Lesen der gesamten Zeile können Sie verwenden nextLine().

RKC
quelle
@LuiggiMendoza meinst du Formatierung, nicht formelles Schreiben?
Det
next () kann die Eingabe nur bis zum Leerzeichen lesen . Es kann keine zwei durch Leerzeichen getrennten Wörter lesen . Leerzeichen enthalten Leerzeichen, Tabulator und Zeilenvorschub
Fred Hu
18

Von JavaDoc:

  • A unterteilt Scannerseine Eingabe in Token mithilfe eines Begrenzungsmusters, das standardmäßig mit Leerzeichen übereinstimmt.
  • next(): Findet das nächste vollständige Token von diesem Scanner und gibt es zurück.
  • nextLine(): Schiebt diesen Scanner über die aktuelle Zeile hinaus und gibt die übersprungene Eingabe zurück.

Also im Falle von "small example<eol>text" next()sollte "klein" und nextLine()sollte "kleines Beispiel" zurückgeben.

Oleg Sklyar
quelle
1
warum nicht next()enthalten die \nin der zurückgegebenen Token ??
Rimalonfire
1
Dies ist eine Frage an die Java-API-Designer oder stellen Sie eine Frage zu SO, und vielleicht weiß jemand warum.
Oleg Sklyar
10

Was mir aufgefallen ist, abgesehen davon, dass next () nur bis zum Leerzeichen scannt, wo nextLine () die gesamte Zeile scannt, ist, dass next wartet, bis es ein vollständiges Token erhält, während nextLine () nicht auf das vollständige Token wartet, wenn jemals '\ n' wird erhalten (dh wenn Sie die Eingabetaste drücken), bewegt sich der Scannercursor zur nächsten Zeile und gibt die übersprungene vorherige Zeile zurück. Es wird nicht geprüft, ob Sie eine vollständige Eingabe gegeben haben oder nicht, auch wenn eine leere Zeichenfolge verwendet wird, während next () keine leere Zeichenfolge verwendet

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

}

Probieren Sie dieses Programm aus, indem Sie die Schleife next () und nextLine () in for ändern. Drücken Sie dann '\ n', dh die Eingabetaste ohne Eingabe. Sie können feststellen, dass die Methode nextLine () nach Drücken einer bestimmten Anzahl von Fällen beendet wird, in denen as next () wird erst beendet, wenn Sie es für die angegebene Anzahl von Fällen angeben und eingeben .

murali krish
quelle
1
Sehr interessantes Beispiel. Beim Ausführen des Codes habe ich endlich gesehen, wie es next()in der Praxis funktioniert. Er ignoriert die Eingabetaste, nexLine()akzeptiert ihn jedoch als vollständige Eingabe und repliziert ihn in die Konsole, wenn Sie den Wert der erfassten Daten wiedergeben. Ich habe gerade System.out.println(str[i]);als neue Zeile unten hinzugefügt str[i]=sc.next();oderstr[i]=sc.nextLine();
Pablo Adames
@PabloAdames schätzen, wenn Sie abstimmen können, wenn die Antwort, wenn Sie so
möchten
9

Der entscheidende Punkt ist, herauszufinden, wo die Methode stoppt und wo sich der Cursor nach dem Aufrufen der Methoden befindet.

Alle Methoden lesen Informationen, die kein Leerzeichen zwischen der Cursorposition und den nächsten Standardtrennzeichen enthalten (Leerzeichen, Tabulator, \ n - erstellt durch Drücken der Eingabetaste). Der Cursor stoppt vor den Begrenzern, mit Ausnahme von nextLine()Informationen (einschließlich Leerzeichen, die durch Trennzeichen erstellt wurden) zwischen der Cursorposition und \ n, und der Cursor stoppt hinter \ n.


Betrachten Sie beispielsweise die folgende Abbildung:

|23_24_25_26_27\n

| -> die aktuelle Cursorposition

_ -> Leerzeichen

stream -> Bold (die Informationen, die von der aufrufenden Methode erhalten wurden)

Sehen Sie, was passiert, wenn Sie diese Methoden aufrufen:

nextInt()    

Lesen Sie 23 | _24_25_26_27 \ n

nextDouble()

Lesen Sie 23_ 24 | _25_26_27 \ n

next()

Lesen Sie 23_24_ 25 | _26_27 \ n

nextLine()

Lesen Sie 23_24_25 _26_27 \ n |


Danach sollte die Methode je nach Ihren Anforderungen aufgerufen werden.

Z. Zhang
quelle
2
so eine unterschätzte Antwort. alles andere ist leicht irreführend
csguy
3

Kurz gesagt: Wenn Sie ein String-Array mit der Länge t eingeben, erwartet Scanner # nextLine () t Zeilen. Jeder Eintrag im String-Array wird durch die Eingabetaste vom anderen unterschieden. Und Scanner # next () nimmt weiterhin Eingaben bis vor Sie drücken die Eingabetaste, speichern jedoch die Zeichenfolge (das Wort) im Array, das durch Leerzeichen getrennt ist.

Schauen wir uns den folgenden Codeausschnitt an

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

Wenn ich in meiner IDE über dem Codeausschnitt laufe (sagen wir für Zeichenfolgenlänge 2), spielt es keine Rolle, ob ich meine Zeichenfolge als eingebe

Eingabe als: - abcd abcd oder

Eingabe als: -

A B C D

A B C D

Die Ausgabe erfolgt wie abcd

A B C D

Wenn wir jedoch im selben Code die next () -Methode durch nextLine () ersetzen

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

Wenn Sie dann die Eingabeaufforderung als - abcd abcd eingeben

Ausgabe ist: -

abcd abcd

und wenn Sie die Eingabeaufforderung an der Eingabeaufforderung als abcd eingeben (und wenn Sie die Eingabetaste drücken, um die nächste abcd in einer anderen Zeile einzugeben, wird die Eingabeaufforderung einfach beendet und Sie erhalten die Ausgabe).

Ausgabe ist: -

A B C D

himani1349
quelle
2

Von Javadocs

next () Gibt das nächste Token zurück, wenn es mit dem aus der angegebenen Zeichenfolge erstellten Muster übereinstimmt. nextLine () Schiebt diesen Scanner über die aktuelle Zeile hinaus und gibt die übersprungene Eingabe zurück.

Welches Sie wählen, hängt davon ab, welches Ihren Bedürfnissen am besten entspricht. Wenn ich eine ganze Datei lesen würde, würde ich mich für nextLine entscheiden, bis ich die gesamte Datei hätte.

einundsechzig
quelle
1

Aus der Dokumentation zum Scanner :

Ein Scanner unterteilt seine Eingabe mithilfe eines Begrenzungsmusters in Token, das standardmäßig mit Leerzeichen übereinstimmt.

Aus der Dokumentation für next () :

Vor einem vollständigen Token folgt eine Eingabe, die dem Begrenzungsmuster entspricht.

Foobar
quelle
1

Die Methoden next () und nextLine () sind dem Scanner zugeordnet und werden zum Abrufen von String-Eingaben verwendet. Ihre Unterschiede sind ...

next () kann die Eingabe nur bis zum Leerzeichen lesen. Es kann keine zwei durch Leerzeichen getrennten Wörter lesen. Außerdem setzt next () den Cursor nach dem Lesen der Eingabe in dieselbe Zeile.

nextLine () liest Eingaben einschließlich Leerzeichen zwischen den Wörtern (dh bis zum Zeilenende \ n). Sobald die Eingabe gelesen wurde, positioniert nextLine () den Cursor in der nächsten Zeile.

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

Ausgabe:

Zeichenfolge für c abc eingeben def
c ist abc

Zeichenfolge für d eingeben

d ist def

Wenn Sie nextLine () anstelle von next () verwenden, dann

Ausgabe:

Zeichenfolge für c eingeben

ABC DEF
c ist ABC DEF Geben Sie
die Zeichenfolge für d ein

GHI
d ist GHI

Musaddique
quelle
1
  • Nur für ein weiteres Beispiel von Scanner.next () und nextLine () gilt Folgendes: nextLine () lässt den Benutzer nicht eingeben, während next () den Scanner warten lässt und die Eingabe liest.

     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
quelle
1

Ein Scanner unterteilt seine Eingabe mithilfe eines Begrenzungsmusters in Token, das standardmäßig als Whitespaces bezeichnet wird .

Next () liest ein einzelnes Wort und wenn es ein Leerzeichen erhält, hört es auf zu lesen und der Cursor kehrt an seine ursprüngliche Position zurück. NextLine (), während dieses ein ganzes Wort liest, auch wenn es auf ein Leerzeichen trifft. Der Cursor stoppt, wenn das Lesen beendet ist, und der Cursor springt zum Zeilenende zurück. Sie müssen also kein Delimeter verwenden, wenn Sie ein vollständiges Wort als Satz lesen möchten. Sie müssen nur NextLine () verwenden.

 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
quelle
1

Beide Funktionen werden verwendet, um zum nächsten Scanner-Token zu wechseln.

Der Unterschied besteht darin, wie das Scannertoken generiert wird

next () generiert Scannertoken mit dem Trennzeichen als Leerraum

nextLine () generiert Scannertoken mit dem Trennzeichen '\ n' (dh Tastendruck eingeben)

Aditya Rewari
quelle
0

Ich habe auch ein Problem mit einem Trennzeichen. Die Frage war alles über Eingaben von

  1. gib deinen Namen ein.
  2. gebe Dein Alter ein.
  3. geben sie ihre E-Mail Adresse ein.
  4. Geben Sie Ihre Adresse ein.

Das Problem

  1. Ich habe mit Name, Alter und E-Mail erfolgreich abgeschlossen.
  2. Als ich die Adresse von zwei Wörtern mit einem Leerzeichen (Harnet Street) fand, bekam ich gerade das erste "Harnet".

Die Lösung

Ich habe das Trennzeichen für meinen Scanner verwendet und bin erfolgreich ausgegangen.

Beispiel

 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
quelle
0

Der grundlegende Unterschied besteht darin, dass next () verwendet wird, um die Eingabe abzurufen, bis das Trennzeichen gefunden wird (standardmäßig ist es ein Leerzeichen, aber Sie können es auch ändern) und das eingegebene Token zurückgibt. Der Cursor bleibt dann in derselben Zeile. Während in nextLine () die Eingabe gescannt wird, bis wir die Eingabetaste drücken, das Ganze zurückgeben und den Cursor in die nächste Zeile setzen. ** **.

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

** **.

Versuchen Sie, diesen Code auszuführen, indem Sie die Eingabe als "Hallo Welt" angeben. Der Scanner liest die Eingabe bis 'o' und dann tritt ein Trennzeichen auf. S [0] ist also "Hallo" und der Cursor zeigt auf die nächste Position nach dem Trennzeichen ( das ist in unserem Fall 'W'), und wenn s [1] gelesen wird, scannt es die "Welt" und gibt sie als nächstes vollständiges Token (per Definition von Scanner) an s [1] zurück. Wenn wir nextLine () verwenden Stattdessen liest es die "Hallo Welt" vollständig und auch mehr, bis wir die Eingabetaste drücken und sie in s [0] speichern. Wir können auch eine andere Zeichenfolge angeben, indem wir nextLine () verwenden. Ich empfehle Ihnen, dieses und weitere Beispiele zu verwenden und um Klarstellung zu bitten.

Einfacher Codierer
quelle