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?
java
java.util.scanner
AnnieOK
quelle
quelle
Antworten:
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ärestr.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
quelle
BufferedReader
, um Zeile für Zeile zu lesen? Ich verstehe nicht, warumScanner
das so angesagt ist.next()
kann die Eingabe nur bis zum Leerzeichen lesen. Es kann keine zwei durch ein Leerzeichen getrennten Wörter lesen. Außerdemnext()
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()
.quelle
Von JavaDoc:
Also im Falle von
"small example<eol>text"
next()
sollte "klein" undnextLine()
sollte "kleines Beispiel" zurückgeben.quelle
next()
enthalten die\n
in der zurückgegebenen Token ??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 .
quelle
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 geradeSystem.out.println(str[i]);
als neue Zeile unten hinzugefügtstr[i]=sc.next();
oderstr[i]=sc.nextLine();
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_
-> Leerzeichenstream -> Bold (die Informationen, die von der aufrufenden Methode erhalten wurden)
Sehen Sie, was passiert, wenn Sie diese Methoden aufrufen:
Lesen Sie 23 | _24_25_26_27 \ n
Lesen Sie 23_ 24 | _25_26_27 \ n
Lesen Sie 23_24_ 25 | _26_27 \ n
Lesen Sie 23_24_25 _26_27 \ n |
Danach sollte die Methode je nach Ihren Anforderungen aufgerufen werden.
quelle
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
quelle
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.
quelle
Aus der Dokumentation zum Scanner :
Aus der Dokumentation für next () :
quelle
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
quelle
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"));
quelle
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); }
quelle
Beide Funktionen werden verwendet, um zum nächsten Scanner-Token zu wechseln.
Der Unterschied besteht darin, wie das Scannertoken generiert wird
quelle
Ich habe auch ein Problem mit einem Trennzeichen. Die Frage war alles über Eingaben von
Das Problem
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); }
quelle
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.
quelle