В чем основное отличие между next()
и nextLine()
?
Моя основная цель - прочитать весь текст, используя Scanner
, который может быть "подключен" к любому источнику (например, файл).
Какой из них выбрать и почему?
В чем основное отличие между next()
и nextLine()
?
Моя основная цель - прочитать весь текст, используя Scanner
, который может быть "подключен" к любому источнику (например, файл).
Какой из них выбрать и почему?
Я всегда предпочитаю читать ввод, используя nextLine()
, а затем анализировать строку.
Использование next()
вернет только то, что находится перед разделителем (по умолчанию используется пробел). nextLine()
автоматически перемещает сканер вниз после возврата текущей строки.
Полезным инструментом для анализа данных из nextLine()
будет str.split("\\s+")
.
String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces
Для получения дополнительной информации о классе Scanner или классе String перейдите по следующим ссылкам.
Сканер: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
Строка: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
next()
может читать ввод только до пробела. Он не может читать два слова, разделенных пробелом. Кроме того, next()
помещает курсор в ту же строку после прочтения ввода.
nextLine()
считывает ввод, включая пробел между словами (то есть, он читается до конца строки \n
). После считывания ввода nextLine()
позиционирует курсор в следующей строке.
Для чтения всей строки вы можете использовать nextLine()
.
Из JavaDoc:
- A
Scanner
разбивает свой вход на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу.next()
: находит и возвращает следующий полный токен из этого сканера.nextLine()
: продвигает этот сканер мимо текущей строки и возвращает введенный текст.
Поэтому в случае "small example<eol>text"
next()
должен возвращаться "маленький", а nextLine()
должен возвращать "маленький пример"
Что я заметил, кроме next() сканирует только до пробела, где nextLine() сканирует всю строку, так это то, что next ожидает, пока не получит полный токен, где nextLine() не ожидает полного токена, когда когда-либо '\n' (то есть, когда вы нажимаете клавишу ввода) курсор сканера перемещается на следующую строку и возвращает предыдущую пропущенную строку. Он не проверяет, указали ли вы полный ввод или нет, даже примет пустую строку, тогда как next() не принимает пустую строку
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();
}
}
}
Попробуйте эту программу, изменив цикл next() и nextLine() в for, продолжая нажимать '\n', то есть клавишу ввода без какого-либо ввода, вы можете обнаружить, что при использовании метода nextLine() он завершается после нажатия заданного числа случаев, когда поскольку next() не завершается, пока вы не предоставите и не введете его для заданного числа случаев.
Для этого вопроса ключевым моментом является поиск того, где остановится метод, и где находится курсор после вызова методов. Все методы будут считывать информацию (не включает пробелы) между позицией курсора и следующими разделителями по умолчанию (пробелы, вкладки, \n - созданные нажатием Enter), и курсор останавливается перед разделителями, за исключением nextLine(), который считывает информацию (включая пробелы, созданные разделителями) между позицией курсора и \n, и курсор останавливается за \n.
Например: (| представляет текущую позицию курсора; _ представляет пробелы; поток в жирной информации, полученной вызывающим методом)
23_24_25_26_27\п
Вызов nextInt(); прочитайте 23 | _24_25_26_27\n
Вызов nextDouble(); прочитайте 23_ 24 | _25_26_27\n
Вызов next(); прочитайте 23_24_ 25 | _26_27\n
Вызов nextLine(); прочитайте 23_24_25 _26_27\n |
После этого метод следует вызывать в зависимости от вашего требования.
От javadocs
next() Возвращает следующий токен, если он соответствует шаблону, построенному из указанной строки. nextLine() Улучшает этот сканер за текущей строкой и возвращает вход, который был пропущен.
Какой из них вы выбираете, зависит от ваших потребностей. Если бы я читал целый файл, я бы пошел на следующую строку, пока у меня не было всего файла.
Вкратце: если вы вводите строковый массив длины t, тогда Scanner # nextLine() ожидает t строк, каждая запись в строковом массиве будет отличаться от другого путем ввода ключа. И сканер # next() будет поддерживать принимая входные данные, пока вы не нажмете enter, а сохраните строку (слово) внутри массива, которая разделяется пробелами.
Давайте посмотрим на следующий фрагмент кода
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 (скажем, для длины строки 2), не имеет значения, буду ли я вводить свою строку в качестве
Вход как: - abcd abcd или
Вход как: -
ABCD
abcd
Выход будет похож ABCD
ABCD
Но если в том же коде мы заменим следующий() метод 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();
}
Затем, если вы вводите ввод в приглашении как - abcd abcd
Выход: -
abcd abcd
и если вы вводите ввод в командной строке как abcd (и если вы нажмете enter, чтобы ввести следующий abcd в другой строке, приглашение ввода просто выйдет, и вы получите результат)
Выход: -
abcd
Из документации для Scanner:
Сканер разбивает свой вход на токены с использованием шаблона разделителя , который по умолчанию соответствует пробелу.
Из документации для next():
Допускается полный токен и за ним следует вход, соответствующий шаблону разделителя.
next() и nextLine() связаны со Сканером и используются для получения входов String. Их отличия...
next() может читать ввод только до пробела. Он не может читать два слова, разделенных пробелом. Кроме того, next() помещает курсор в ту же строку после прочтения ввода.
nextLine() считывает ввод, включая пробел между словами (то есть, он читает до конца строки \n). После ввода ввода nextLine() позиционирует курсор в следующей строке.
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);
}
}
Вывод:
введите строку для c
abc def
c - abc
введите строку для d
d является def
Если вы используете nextLine() вместо next(), то
Вывод:
введите строку для c
ABC DEF
c - ABC DEF
введите строку для d
ГХИ
d - GHI
Просто для другого примера Scanner.next() и nextLine() выглядит так: nextLine() не позволяет вводить тип пользователя, а next() заставляет сканер ждать и читать ввод.
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"));
Сканер разбивает свои входные данные на токены, используя шаблон разделителя, который по умолчанию известен как пробельные символы.
Next() используется для чтения одного слова, и когда он получает пробел, он прекращает чтение и курсор возвращается в исходное положение. NextLine(), в то время как это читает целое слово, даже когда оно встречает пробел. Курсор останавливается, когда он закончил чтение, и курсор возвращается к концу строки. так что вам не нужно использовать разделитель, когда вы хотите прочитать полное слово как предложение. вам просто нужно использовать 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);
}
У меня также есть проблема, связанная с разделителем. вопрос был весь о вкладе
Эта проблема
Решение
Я использовал разделитель для моего сканера и вышел успешно.
пример
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);
}
Учитывая этот код ниже:
Scanner reader = new Scanner( System.in );
System.out.println( "Enter his yardage for the first game: " );
double g1= reader.nextDouble();
**System.out.println( "Enter game 1 opponent " );
String o1 = reader.nextLine();
System.out.println( "Enter his yardage for the second game: " );
double g2= reader.nextDouble();**
это выводит:
Enter his yardage for the first game:
100
Enter game 1 opponent
Enter his yardage for the second game:
и я не получаю возможность войти в его игру с одним противником, Холли Хиллз. Программа пропускает право на вход во вторую игру.
Почему это? Я выбрал nextLine(), чтобы я мог войти в Holly Hills, не вводя его как Holly_Hills. Если я использую next(); программа работает, как и предполагалось, хотя я должен войти в Holly Hills как Holly_Hills. Не идеально, но это работает.
Основное отличие заключается в следующем:() используется для получения ввода до тех пор, пока не встретится разделитель (по умолчанию это пробел, но вы также можете изменить его) и вернуть введенный токен. Курсор останется на той же строке. Принимая во внимание, что в nextLine() он сканирует ввод до тех пор, пока мы не нажмем кнопку ввода, не вернем все и поместим курсор в следующую строку. **
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]);
}
**
Попробуйте запустить этот код, задав Input как "Hello World". Сканер считывает ввод до "o", а затем происходит разделитель. Поэтому s [0] будет "Hello" и курсор будет указывать на следующую позицию после разделителя ( в нашем случае это 'W'), и когда s [1] читается, он сканирует "Мир" и возвращает его в s [1] как следующий полный токен (по определению Scanner). Если мы используем nextLine() вместо этого он будет читать "Hello World" полностью, а также больше, пока мы не нажмем кнопку ввода и не сохраним его в s [0]. Мы можем дать другую строку также с помощью nextLine(). Я рекомендую вам попробовать использовать этот пример и многое другое и попросить каких-либо разъяснений.