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


87

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

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


Это может вам помочь [Использование scanner.nextLine ()] [1]: stackoverflow.com/questions/5032356/using-scanner-nextline
Milaci

Ответы:


86

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


5
Так почему бы просто не использовать a BufferedReaderдля построчного чтения? Не понимаю, почему Scannerэто так модно.
Дэвид Конрад

7
@DavidConrad "В чем разница между методами next () и nextLine () из класса Scanner?"
Тристан

4
Да, я понимаю, что это то, о чем спрашивал ОП, мне просто интересно, поскольку вы говорите, что «всегда предпочитаете» использовать nextLine.
Дэвид Конрад

Вы можете безопасно выполнить nextLine (), а затем создать новый сканер только для этой строки. Класс Scanner может сканировать строки: new Scanner (new Scanner (System.in) .nextLine ()).
axell13

47

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

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

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


@LuiggiMendoza, вы имеете в виду форматирование, а не формальное письмо?
Det

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

18

Из JavaDoc:

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

Так что в случае, если "small example<eol>text" next()должен вернуть «маленький» и nextLine()должен вернуть «маленький пример»


1
почему не next()включает \nв возвращаемый токен ??
rimalonfire

1
Это вопрос к разработчикам Java API, или задайте вопрос по SO, и, возможно, кто-нибудь знает почему.
Олег Скляр

10

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


1
Очень интересный пример. Запустив код, я наконец увидел, как next()работает на практике, он игнорирует клавишу ввода, тогда как nexLine()принимает его как полный ввод и реплицирует его на консоль, если вы повторяете значение того, что было захвачено. Я только что добавил System.out.println(str[i]);новую строчку ниже str[i]=sc.next();илиstr[i]=sc.nextLine();
Пабло Адамес

@PabloAdames признателен, если вы можете проголосовать за ответ, если хотите,
murali krish

9

Ключевой момент - найти, где остановится метод и где будет курсор после вызова методов.

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


Например, рассмотрим следующую иллюстрацию:

|23_24_25_26_27\n

| -> текущая позиция курсора

_ -> пробел

stream -> Bold (информация, полученная вызывающим методом)

Посмотрите, что происходит, когда вы вызываете эти методы:

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 |


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


2
такой недооцененный ответ. все остальное немного вводит в заблуждение
csguy

3

Вкратце: если вы вводите строковый массив длины t, то Scanner # nextLine () ожидает t строк, каждая запись в строковом массиве отличается от другой клавишей ввода. И Scanner # 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

Но если в том же коде заменить метод next () на 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


2

Из javadocs

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

Какой из них вы выберете, зависит от ваших потребностей. Если бы я читал весь файл, я бы пошел на nextLine, пока не получил весь файл.


1

Из документации к Сканеру :

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

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

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


1

Методы 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 is abc

введите строку для d

d is def

Если вы используете nextLine () вместо next (), тогда

Выход:

введите строку для c

ABC DEF
c -
строка ABC DEF для ввода d

GHI
d is GHI


1
  • Вот еще один пример Scanner.next () и nextLine (), как показано ниже: nextLine () не позволяет пользователю вводить текст, в то время как next () заставляет Scanner ждать и читать ввод.

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

1

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

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

1

Обе функции используются для перехода к следующему токену сканера.

Разница заключается в том, как генерируется токен сканера.

next () генерирует токены сканера, используя разделитель как пробел

nextLine () генерирует токены сканера с использованием разделителя как '\ n' (т.е. нажатие клавиши Enter)


0

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

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

Проблема

  1. Я успешно закончил с именем, возрастом и адресом электронной почты.
  2. Когда я придумал адрес из двух слов с пробелом (улица Харнет), я получил первое слово «харнет».

Решение

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

пример

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

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.