Подтвердить что ты не робот

Какая разница между методами next() и nextLine() из класса Scanner?

В чем основное отличие между next() и nextLine()?
Моя основная цель - прочитать весь текст, используя Scanner, который может быть "подключен" к любому источнику (например, файл).

Какой из них выбрать и почему?

4b9b3361

Ответ 1

Я всегда предпочитаю читать ввод, используя 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

Ответ 2

next() может читать ввод только до пробела. Он не может читать два слова, разделенных пробелом. Кроме того, next() помещает курсор в ту же строку после прочтения ввода.

nextLine() считывает ввод, включая пробел между словами (то есть, он читается до конца строки \n). После считывания ввода nextLine() позиционирует курсор в следующей строке.

Для чтения всей строки вы можете использовать nextLine().

Ответ 3

Из JavaDoc:

  • A Scanner разбивает свой вход на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу.
  • next(): находит и возвращает следующий полный токен из этого сканера.
  • nextLine(): продвигает этот сканер мимо текущей строки и возвращает введенный текст.

Поэтому в случае "small example<eol>text" next() должен возвращаться "маленький", а nextLine() должен возвращать "маленький пример"

Ответ 4

Что я заметил, кроме 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() не завершается, пока вы не предоставите и не введете его для заданного числа случаев.

Ответ 5

Для этого вопроса ключевым моментом является поиск того, где остановится метод, и где находится курсор после вызова методов. Все методы будут считывать информацию (не включает пробелы) между позицией курсора и следующими разделителями по умолчанию (пробелы, вкладки, \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 |

После этого метод следует вызывать в зависимости от вашего требования.

Ответ 6

От javadocs

next() Возвращает следующий токен, если он соответствует шаблону, построенному из указанной строки. nextLine() Улучшает этот сканер за текущей строкой и возвращает вход, который был пропущен.

Какой из них вы выбираете, зависит от ваших потребностей. Если бы я читал целый файл, я бы пошел на следующую строку, пока у меня не было всего файла.

Ответ 7

Вкратце: если вы вводите строковый массив длины 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

Ответ 8

Из документации для Scanner:

Сканер разбивает свой вход на токены с использованием шаблона разделителя , который по умолчанию соответствует пробелу.

Из документации для next():

Допускается полный токен и за ним следует вход, соответствующий шаблону разделителя.

Ответ 9

Методы

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

Ответ 10

  • Просто для другого примера 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"));
    

Ответ 11

Сканер разбивает свои входные данные на токены, используя шаблон разделителя, который по умолчанию известен как пробельные символы.

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

Ответ 12

У меня также есть проблема, связанная с разделителем. вопрос был весь о вкладе

  1. введите ваше имя.
  2. введите свой возраст.
  3. введите адрес электронной почты.
  4. введите свой адрес

Эта проблема

  1. Я успешно закончил с именем, возрастом и электронной почтой.
  2. Когда я пришла в адрес двух слов, имеющих пропуска (улица Harnet) Я только что получил первый один "harnet".

Решение

Я использовал разделитель для моего сканера и вышел успешно.

пример

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

Ответ 13

Учитывая этот код ниже:

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. Не идеально, но это работает.

Ответ 14

Основное отличие заключается в следующем:() используется для получения ввода до тех пор, пока не встретится разделитель (по умолчанию это пробел, но вы также можете изменить его) и вернуть введенный токен. Курсор останется на той же строке. Принимая во внимание, что в 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(). Я рекомендую вам попробовать использовать этот пример и многое другое и попросить каких-либо разъяснений.