Jaka jest główna różnica między next()
i nextLine()
?
Moim głównym celem jest przeczytanie całego tekstu, Scanner
który może być „podłączony” do dowolnego źródła (na przykład pliku).
Który wybrać i dlaczego?
java
java.util.scanner
AnnieOK
źródło
źródło
Odpowiedzi:
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łobystr.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
źródło
BufferedReader
do czytania wiersz po wierszu? Nie rozumiem, dlaczegoScanner
jest w takiej modzie.next()
może odczytać wejście tylko do spacji. Nie może czytać dwóch słów oddzielonych spacją. Ponadtonext()
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ścianextLine()
ustawia kursor w następnym wierszu.Do czytania całej linii możesz użyć
nextLine()
.źródło
Z JavaDoc:
Więc w przypadku
"small example<eol>text"
next()
powinien zwrócić „mały” inextLine()
powinien zwrócić „mały przykład”źródło
next()
obejmują\n
w zwrócony tokenu ??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.
źródło
next()
działa w praktyce, ignoruje on klawisz enter, podczas gdynexLine()
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łemSystem.out.println(str[i]);
jako nową linię poniżejstr[i]=sc.next();
lubstr[i]=sc.nextLine();
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_
-> spacjestrumień -> Bold (informacja uzyskana przez metodę wywołującą)
Zobacz, co się stanie, gdy wywołasz te metody:
przeczytaj 23 | _24_25_26_27 \ n
przeczytaj 23_ 24 | _25_26_27 \ n
przeczytaj 23_24_ 25 | _26_27 \ n
przeczytaj 23_24_25 _26_27 \ n |
Następnie metodę należy wywołać w zależności od wymagań.
źródło
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
źródło
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.
źródło
Z dokumentacji skanera :
Z dokumentacji dla next () :
źródło
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
źródło
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"));
źródło
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); }
źródło
Obie funkcje służą do przejścia do następnego tokena skanera.
Różnica polega na sposobie generowania tokena skanera
źródło
Mam też problem z separatorem. pytanie dotyczyło tylko danych wejściowych
Problem
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); }
źródło
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.
źródło