Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Nextint java scanner

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

60 AnnieOK [2014-03-17 18:34:00]

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

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

13 ответов

61 Решение Tristan [2014-03-17 18:42:00]

Я всегда предпочитаю читать ввод с помощью nextLine() , а затем анализировать строку.

Использование next() будет возвращать только то, что приходит перед пробелом. nextLine() автоматически перемещает сканер вниз после возврата текущей строки.

Полезным инструментом для анализа данных из nextLine() будет str.split(«\s+») .

Для получения дополнительной информации о классе сканера или классе String обратитесь к следующим ссылкам.

30 RKC [2014-03-17 18:37:00]

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

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

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

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

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

Что я заметил, кроме next() сканирует только до пробела, где nextLine() сканирует всю строку, так это то, что next ожидает, пока не получит полный токен, где nextLine() не ожидает полного токена, когда когда-либо ‘n’ (то есть, когда вы нажимаете клавишу ввода) курсор сканера перемещается на следующую строку и возвращает предыдущую пропущенную строку. Он не проверяет, указали ли вы полный ввод или нет, даже примет пустую строку, тогда как next() не принимает пустую строку

Попробуйте эту программу, изменив цикл next() и nextLine() в for, продолжая нажимать ‘n’, то есть клавишу ввода без какого-либо ввода, вы можете обнаружить, что при использовании метода nextLine() он завершается после нажатия заданного числа случаев, когда поскольку next() не завершается, пока вы не предоставите и не введете его для заданного числа случаев.

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

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

3 Z. Zhang [2017-02-15 06:32:00]

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

Например: (| представляет текущую позицию курсора; _ представляет пробелы; поток в жирной информации, полученной вызывающим методом)

Вызов nextInt(); прочитайте 23 | _24_25_26_27n

Вызов nextDouble(); прочитайте 23_ 24 | _25_26_27n

Вызов next(); прочитайте 23_24_ 25 | _26_27n

Вызов nextLine(); прочитайте 23_24_25 _26_27n |

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

Вкратце: если вы вводите строковый массив длины t, тогда Scanner # nextLine() ожидает t строк, каждая запись в строковом массиве будет отличаться от другого путем ввода ключа. И сканер # next() будет поддерживать принимая входные данные, пока вы не нажмете enter, а сохраните строку (слово) внутри массива, которая разделяется пробелами.

Давайте посмотрим на следующий фрагмент кода

когда я запускаю над фрагментом кода в своей среде IDE (скажем, для длины строки 2), не имеет значения, буду ли я вводить свою строку в качестве

Вход как: — abcd abcd или

Выход будет похож ABCD

Но если в том же коде мы заменим следующий() метод nextLine()

Затем, если вы вводите ввод в приглашении как — abcd abcd

и если вы вводите ввод в командной строке как abcd (и если вы нажмете enter, чтобы ввести следующий abcd в другой строке, приглашение ввода просто выйдет, и вы получите результат)

next() и nextLine() связаны со Сканером и используются для получения входов String. Их отличия.

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

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

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

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

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

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

ABC DEF
c — ABC DEF
введите строку для d

Просто для другого примера Scanner.next() и nextLine() выглядит так: nextLine() не позволяет вводить тип пользователя, а next() заставляет сканер ждать и читать ввод.

1 Negash [2018-04-06 18:30:00]

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

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

1 Foobar [2014-03-17 18:40:00]

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

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

Читать еще:  Java lang string что это

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

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

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

и я не получаю возможность войти в его игру с одним противником, Холли Хиллз. Программа пропускает право на вход во вторую игру.

Почему это? Я выбрал nextLine(), чтобы я мог войти в Holly Hills, не вводя его как Holly_Hills. Если я использую next(); программа работает, как и предполагалось, хотя я должен войти в Holly Hills как Holly_Hills. Не идеально, но это работает.

0 Negash [2018-04-06 18:41:00]

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

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

Эта проблема

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

Решение

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

Использование класса Scanner в Java — примеры и методы

Это руководство по посвящено использованию класса Scanner в Java пакета java.util. Мы будем показывать базовое применение класса Scanner до самых расширенных функций этого класса, используя примеры.

Класс Scanner имеет богатый набор API, который обычно используется для разбиения входных данных конструктора Scanner на токены. Входные данные разбиваются на токены с помощью разделителя, определенного в классе Scanner с использованием метода radix, или могут быть определены.

Объявление:
public final class Scanner
extends Object
implements Iterator, Closeable

Конструкторы класса Scanner — public Scanner(Readable source)

Создает новый сканер, который создает значения, отсканированные из указанного источника.

Параметры: source — источник символов, реализующий интерфейс Readable

Не путайте с типом объекта, доступным для чтения в качестве параметра конструктора. Readable — это интерфейс, который был реализован с помощью BufferedReader, CharArrayReader, CharBuffer, FileReader, FilterReader, InputStreamReader, LineNumberReader, PipedReader, PushbackReader, Reader, StringReader.

Это означает, что мы можем использовать любой из этих классов в Java при создании экземпляра объекта Scanner.

public Scanner(InputStream source)

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

Параметры: источник — входной поток для сканирования.

Метод ввода этого конструктора — InputStream. Класс InputStream является одним из классов верхнего уровня в пакете java.io, и его использование будет проблемой.

Однако мы можем использовать подклассы InputStream, как показано ниже. Мы использовали FileInputStream, поскольку он является подклассом InputStream, при его включении проблем не возникнет.

public Scanner(File source) выдает исключение FileNotFoundException

Байты из файла преобразуются в символы с кодировкой по умолчанию базовой платформы.
Параметры: источник — файл для сканирования

Этот конструктор очень прост. Просто требует источник файла. Единственной целью этого конструктора является создание экземпляра объекта Scanner для сканирования через файл.

public Scanner(Path source) throws IOException

источник — путь к файлу для сканирования. Для параметра конструктора требуется источник Path, который используется редко.

public Scanner(String source)

Создает новый сканер, который выдает значения, отсканированные из указанной строки.

Источник — строка для сканирования.

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

Scanner в Java для чтения файлов

Считать файл очень легко, используя класс Scanner. Нам просто нужно объявить это с помощью конструктора Scanner, например:

Хитрость в итерации по токену Scanner состоит в том, чтобы применять те методы, которые начинаются с hasNext, hasNextInt и т.д. Давайте сначала остановимся на чтении файла построчно.

В приведенном выше фрагменте кода мы использовали флаг scan.hasNextLine() как средство проверки наличия токена, который в этом примере доступен на входе сканера. Метод nextLine() возвращает текущий токен и переходит к следующему.

Комбинации hasNextLine() и nextLine() широко используются для получения всех токенов на входе сканера. После этого мы вызываем метод close(), чтобы закрыть объект и тем самым избежать утечки памяти.

Считать строку из консоли ввода, используя Scanner Class

Класс Scanner принимает также InputStream для одного из своих конструкторов. Таким образом, ввод можно сделать с помощью:

После помещения в наш объект сканера, у нас теперь есть доступ к читаемому и конвертируемому потоку, что означает, что мы можем манипулировать или разбивать входные данные на токены. Используя богатый набор API сканера, мы можем читать токены в зависимости от разделителя, который мы хотим использовать в конкретном типе данных.

Важные советы

Недавно я обнаружил одну проблему. Допустим, что мы просим пользователя ввести идентификатор сотрудника и имя сотрудника из консоли.

После чего мы будем читать ввод с консоли, используя сканер. Идентификатор сотрудника будет читаться с nextInt(), а имя сотрудника будет читаться как nextLine(). Это довольно просто, но это не сработает.

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

Nextint java scanner

Для получения данных, введенных пользователем, а также для вывода сообщений нам необходим ряд классов, через которые мы сможем взаимодействовать с консолью. Частично их использование уже рассматривалось в предыдущих темах. Для взаимодействия с консолью нам необходим класс System . Этот класс располагается в пакете java.lang, который автоматически подключается в программу, поэтому нам не надо дополнительно импортировать данный пакет и класс.

ВЫВОД НА КОНСОЛЬ.

Для создания потока вывода в класс System определен объект out . В этом объекте определен метод println , который позволяет вывести на консоль некоторое значение с последующим переводом консоли на следующую строку:

В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print() , который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.

Читать еще:  Java для web

Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность n:

Если у нас есть два числа, и мы хотим вывести их значения на экран, то мы можем, например, написать так:

Но в Java есть также функция для форматированного вывода, унаследованная от языка С: System.out.printf() . С ее помощью мы можем переписать предыдущий пример следующим образом:

В данном случае символы %d обозначают спецификатор, вместо которого подставляет один из аргументов. Спецификаторов и соответствующих им аргументов может быть множество. В данном случае у нас только два аргумента, поэтому вместо первого %d подставляет значение переменной x, а вместо второго — значение переменной y. Сама буква d означает, что данный спецификатор будет использоваться для вывода целочисленных значений типа int .

Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:

  • %x : для вывода шестнадцатеричных чисел
  • %f : для вывода чисел с плавающей точкой
  • %e : для вывода чисел в экспоненциальной форме, например, 1.3e+01
  • %c : для вывода одиночного символа
  • %s : для вывода строковых значений

При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f , где .2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:

КОНСОЛЬНЫЙ ВВОД

Для получения консольного ввода в классе System определен объект in . Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner , который, в свою очередь использует System.in. Например, создадим маленькую программу, которая осуществляет ввод чисел:

Так как класс Scanner находится в пакете java.util, то мы вначале его импортируем. Для создания самого объекта Scanner в его конструктор передается объект System.in . После этого мы можем получать вводимые значения. Например, чтобы получить введенное число, используется метод in.nextInt(); , который возвращает введенное с клавиатуры целочисленное значение.

В данном случае в цикле вводятся все элементы массива, а с помощью другого цикла все ранее введенные элементы массива выводятся в строчку.

Класс Scanner имеет еще ряд методов, которые позволяют получить введенные пользователем значения:

  • next() : считывает введенную строку до первого пробела
  • nextLine() : считывает всю введенную строку
  • nextInt() : считывает введенное число int
  • nextDouble() : считывает введенное число double
  • hasNext() : проверяет, было ли введено слово
  • hasNextInt() : проверяет, было ли введено число int
  • hasNextDouble() : проверяет, было ли введено double

Кроме того, класс Scanner имеет еще ряд методов nextByte/nextShort/nextFloat/nextBoolean , которые по аналогии с nextInt считывают данные определенного типа данных.

Создадим следующую программу для ввода информации о человеке:

Java сканер: nextInt

Я новичок в программировании (learning Java). Я пытаюсь написать программу, в которой я перечисляю четыре различных варианта для пользователя на выбор.

Проблема заключается в следующем: когда пользователь вводит, какой вариант он хочет выбрать, он должен ввести число (x-это число, которое он выбирает) x количество раз. Например, пользователь хочет выбрать вариант 3. Они должны ввести число 3 три раза в консоль, прежде чем она поймет и завершит следующую строку.

Вот консоль после запуска программы:

Пожалуйста, введите свое имя: стог — Привет, Рик. Вы заработали 2 очка обновления. Какой из следующих признаков вы хотели бы boost на 2 балла? 1. обновления1 2. upgrade2 3. upgrade3 4. upgrade4 Три Три Три Ваш уровень upgrade3 теперь: 2

Я надеюсь, что это имеет смысл, и любая помощь очень ценится (я предполагаю, что я просто делаю глупую ошибку новичка). Кроме того, если у вас есть какая-либо конструктивная критика по поводу того, как он структурирован, пожалуйста, не стесняйтесь. Спасибо!

4 Ответов

Вы не можете постоянно звонить scan.nextInt(). Если, конечно, вы не ожидаете, что будет прочитано несколько различных целых чисел.

Каждый раз, когда вы вызываете scan.nextInt в одном из ваших операторов if, он читает другой int. Изменение:

Что же касается конструктивной критики, то выберите стиль, который вам нравится, и используйте его. Ваши отступы повсюду; это делает код более трудным для чтения. Это не имеет значения, если это широко используемый стиль, и не имеет значения, что все остальные думают о нем, просто убедитесь, что он вам нравится и придерживайтесь его.

Eclipse может автоматически форматировать код для вас, и это поведение настраивается (вы можете fiddle с ним, чтобы он соответствовал вашему стилю).

Каждый раз, когда вы вызываете nextInt() , другой int считывается из входных данных. Вы таким образом хотите вызвать его только один раз!

Это происходит потому, что вы вызываете scan.nextInt() в каждом операторе if/else if. То, что вы хотите сделать, это сохранить введенное значение, а затем проверить его в операторах if/else if, иначе вы в основном предлагаете пользователю ввести его несколько раз.

Похожие вопросы:

Я слышал, что nextInt() читает только целые числа и игнорирует n в конце. Так почему же следующий код выполняется успешно? Почему нет ошибки после ввода значения a так как n должен оставаться в.

У меня есть программа в java, в которой я должен получить пользовательский ввод, однако мне нужно только получить пользовательский ввод один раз, после этого мне больше не нужен сканер. Выполнив.

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

В java, когда я работал над Netbeans Ide, я видел метод nextInt (int radix). Я попытался реализовать это и передал целое число, но это дало исключение InputMismatchException . Мой код выглядит.

У меня есть вопрос о сканере Java. Я пишу программу tic-tac-toe, и эта функция вызывается каждый раз, когда игрок должен сделать свой ход. public void mossa()< int riga, colonna; int errore; Scanner.

Читать еще:  Java calendar set

Я использую сканер для приема пользователя input в java. когда я использую nextInt() и пользователь вводит 2 5, то значение 2 присваивается и 5 выбрасывается. Что делать, если я хочу показать, что.

Я пытаюсь проанализировать информацию из текстового файла в следующем формате: WarningGeotask: 0, 1 Первое слово-это ключевое слово для определенного объекта, создаваемого в координатном положении.

Nextint java scanner

I don’t understand why this program after it displays the line :»Enter 2nd string, Enter ‘quit’ to exit «doesn’t wait for the user to enters a String ?

It has to do with the way Scanner works, and it is very confusing. Basically, nextInt does not consume the CR at the end of the input and leaves it in the buffer. This is fine if the next call is to nextInt as it will skip pass the CR to find the int. But with nextLine it is looking for the CR to terminate the line. So a nextLine after a nextInt «skips» the input and interprets the CR as an empty line.

The way around it is to call next (Edit: my class uses nextLine) after the nextInt, or create a class to do it for you.

so:
nextInt() finds int until CR but it doesn’t consumes CR
nextLine() copies everything until CR includin CR

so what next() does?

My understanding is that next gets the next token — delimited by separators — and nextLine consumes the entire line. But if the separators are whitespace, which they are by default, then this distinction isn’t very great.

I would advise playing with it to get the best behavior. Also, I would create a class that takes care of all of this if you will be writing many console programs.

John Losty wrote: so:
nextInt() finds int until CR but it doesn’t consumes CR
nextLine() copies everything until CR includin CR

so what next() does?

The nextInt() method grabs the next token, but it doesn’t consume anything after the token. meaning any delimiters, following tokens, and/or including the CR. It also processes the token to be an integer, throwing an exception if it fails.

The nextLine() method grabs everything from the current position to the CR — leaving the next position at the beginning of the next line.

The next() method grabs the next token, just like the nextInt() method, except it doesn’t parse it for an integer. It simply returns the next token.

Knute Snortum wrote: My understanding is that next gets the next token — delimited by separators — and nextLine consumes the entire line. But if the separators are whitespace, which they are by default, then this distinction isn’t very great. I would advise playing with it to get the best behavior.

Great advice, but I have to stick my oar in here (and I know I’m on a hiding to nothing if Campbell gets involved ):

This is why I don’t like Scannerespecially for keyboard input.

Why should I have to «play around» with a class to understand how it works?

@John — My advice when using Scanner for keyboard input (and there’ll be LOTS that disagree with me):
Use nextLine(). ALWAYS. It almost never throws an Exception — and if it does, there’s probably nothing you could have done about it anyway — and it returns you a String.

And It DOES consume the CR you get when you hit the ENTER key, so it’s always leaves the Scanner in a state to accept another call to newLine().

OK, so now you have a String. What is it supposed to be?

  • A Number? Simple: use Integer.parseInt(), or Double parseDouble(), or new BigInteger(String), or any one of the ‘valueOf(String)‘ factories the bods at Sun gave you for wrapper classes.
  • A Date? Simple: Use SimpleDateFormat.parse().
  • A pattern of some kind? Simple: Use String.matches().
  • Something else? Call the custom routine you wrote to turn a String into a virtual machine that makes tea for you (or whatever).
    Alright, so it might take a few extra lines of code, but now you’re in control of the process; not some useless f@$!%# class that can’t make up it’s mind whether it likes CRs or not.

    Having said all that (I’m feeling better now), I think that Scanner‘s designers hearts were in the right place. They just made a pig’s ear of it.

    Happy New Year everyone.

    Winston Gutkowski wrote:
    @John — My advice when using Scanner for keyboard input (and there’ll be LOTS that disagree with me):
    (. )

    You’re not alone in this; I agree.

    And a Happy New Year to you too!

    Happy New year too

    I have been too busy to get involved earlier, I am afraid. A long time ago Winston described the real problem with Scanner: Sun/Oracle didn’t provide a good tutorial about how it works. The books all say that nextLine returns the next line, which it doesn’t. Yes, nextInt parses the next instance of numbers as an int, next returns the next “token”, delimited by the current “delimiter”, as Knute said. And nextLine returns from where you are to the next line end characters (might be CR might be LF might be some other sort of line end). Since line end characters are included in the default “delimiter”, as Knute also said, they are not consumed by next or nextInt. You can see the default delimiter like this:- At least I think that will work.

  • Ссылка на основную публикацию
    Adblock
    detector