Как работает hasnext java
Перейти к содержимому

Как работает hasnext java

  • автор:

Как работает hasnext java

Одним из ключевых методов интерфейса Collection является метод Iterator iterator() . Он возвращает итератор — то есть объект, реализующий интерфейс Iterator .

Интерфейс Iterator имеет следующее определение:

public interface Iterator

Реализация интерфейса предполагает, что с помощью вызова метода next() можно получить следующий элемент. С помощью метода hasNext() можно узнать, есть ли следующий элемент, и не достигнут ли конец коллекции. И если элементы еще имеются, то hasNext() вернет значение true . Метод hasNext() следует вызывать перед методом next() , так как при достижении конца коллекции метод next() выбрасывает исключение NoSuchElementException . И метод remove() удаляет текущий элемент, который был получен последним вызовом next() .

Используем итератор для перебора коллекции ArrayList:

import java.util.*; public class Program < public static void main(String[] args) < ArrayListstates = new ArrayList(); states.add("Germany"); states.add("France"); states.add("Italy"); states.add("Spain"); Iterator iter = states.iterator(); while(iter.hasNext()) < System.out.println(iter.next()); >> >

Интерфейс Iterator предоставляет ограниченный функционал. Гораздо больший набор методов предоставляет другой итератор — интерфейс ListIterator . Данный итератор используется классами, реализующими интерфейс List , то есть классами LinkedList, ArrayList и др.

Интерфейс ListIterator расширяет интерфейс Iterator и определяет ряд дополнительных методов:

  • void add(E obj) : вставляет объект obj перед элементом, который должен быть возвращен следующим вызовом next()
  • boolean hasNext() : возвращает true , если в коллекции имеется следующий элемент, иначе возвращает false
  • boolean hasPrevious() : возвращает true , если в коллекции имеется предыдущий элемент, иначе возвращает false
  • E next() : возвращает текущий элемент и переходит к следующему, если такого нет, то генерируется исключение NoSuchElementException
  • E previous() : возвращает текущий элемент и переходит к предыдущему, если такого нет, то генерируется исключение NoSuchElementException
  • int nextIndex() : возвращает индекс следующего элемента. Если такого нет, то возвращается размер списка
  • int previousIndex() : возвращает индекс предыдущего элемента. Если такого нет, то возвращается число -1
  • void remove() : удаляет текущий элемент из списка. Таким образом, этот метод должен быть вызван после методов next() или previous() , иначе будет сгенерировано исключение IlligalStateException
  • void set(E obj) : присваивает текущему элементу, выбранному вызовом методов next() или previous() , ссылку на объект obj
import java.util.*; public class Program < public static void main(String[] args) < ArrayListstates = new ArrayList(); states.add("Germany"); states.add("France"); states.add("Italy"); states.add("Spain"); ListIterator listIter = states.listIterator(); while(listIter.hasNext()) < System.out.println(listIter.next()); >// сейчас текущий элемент - Испания // изменим значение этого элемента listIter.set("Португалия"); // пройдемся по элементам в обратном порядке while(listIter.hasPrevious()) < System.out.println(listIter.previous()); >> >

Класс Scanner

Класс Scanner упрощает разбор строки из потока ввода, позволяя обойтись без классов BufferedReader, InputStreamReader. В качестве входных объектов можно использовать File, InputStream, String, Readable. В учебных примерах часто используют System.in в качестве приёма данных от настольной клавиатуры, что не слишком актуально для Android.

Метод next() возвращает следующую лексему String, также существуют методы для примитивных типов, например, nextInt(). Метод выполняется в блокирующем режиме. Также существуют соответствующие методы hasNext(), которые возвращают true, если следующая лексема относится к правильному типу.

По умолчанию входные данные разбиваются по пробелам между словами. Можно задать собственный разделитель в форме регулярного выражения в методе useDelimiter().

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

 Scanner scanner = new Scanner("Кот Васька 28 Москва"); while (scanner.hasNext()) < System.out.println(scanner.next()); >// Ответ I/System.out: Кот I/System.out: Васька I/System.out: 28 I/System.out: Москва 
 Scanner scanner = new Scanner("27"); System.out.println(scanner.nextInt()); // 27 

Как работает hasnext java

Javatpoint Services

JavaTpoint offers too many high quality services. Mail us on [email protected], to get more information about given services.

  • Website Designing
  • Website Development
  • Java Development
  • PHP Development
  • WordPress
  • Graphic Designing
  • Logo
  • Digital Marketing
  • On Page and Off Page SEO
  • PPC
  • Content Development
  • Corporate Training
  • Classroom and Online Training
  • Data Entry

Training For College Campus

JavaTpoint offers college campus training on Core Java, Advance Java, .Net, Android, Hadoop, PHP, Web Technology and Python. Please mail your requirement at [email protected].
Duration: 1 week to 2 week

Like/Subscribe us for latest updates or newsletter RSS Feed Subscribe to Get Email Alerts Facebook Page Twitter Page YouTube Blog Page

Java Scanner hasNext() против hasNextLine()

Класс Scanner — это удобный инструмент, который может анализировать примитивные типы и строки с помощью регулярных выражений. Он был представлен в пакете java.util в Java 5.

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

Вы также можете прочитать больше о универсальном классе Scanner в кратком руководстве здесь .

2. имеетСледующий() ​

2.1. Основное использование​

Метод hasNext() проверяет, есть ли у сканера другой токен на входе. Сканер разбивает входные данные на токены, используя шаблон разделителя, который по умолчанию соответствует пробелу . То есть hasNext() проверяет ввод и возвращает true , если он содержит другой непробельный символ.

Мы также должны отметить несколько деталей о разделителе по умолчанию:

  • Пробел включает в себя не только символ пробела, но и пробел ( \t ), перевод строки ( \n ) и даже больше символов .
  • Непрерывные пробельные символы рассматриваются как один разделитель.
  • Пустые строки в конце ввода не печатаются, то есть функция hasNext() возвращает false для пустых строк .

Давайте посмотрим на пример того, как hasNext() работает с разделителем по умолчанию. Во- первых, мы подготовим входную строку, которая поможет нам изучить результат синтаксического анализа S canner :

 String INPUT = new StringBuilder()   .append("magic\tproject\n")   .append(" database: oracle\n")   .append("dependencies:\n")   .append("spring:foo:bar\n")   .append("\n") // Note that the input ends with a blank line   .toString(); 

Далее, давайте проанализируем ввод и напечатаем результат:

 Scanner scanner = new Scanner(INPUT);   while (scanner.hasNext())    log.info(scanner.next());   >  log.info("--------OUTPUT--END---------") 

Если мы запустим приведенный выше код, мы увидим вывод консоли:

 [DEMO]magic  [DEMO]project  [DEMO]database:   [DEMO]oracle  [DEMO]dependencies:   [DEMO]spring:foo:bar  [DEMO]--------OUTPUT--END--------- 

2.2. С настраиваемым разделителем​

До сих пор мы рассматривали hasNext() с разделителем по умолчанию. Класс Scanner предоставляет метод « useDelimiter (String pattern) , который позволяет нам изменить разделитель. После изменения разделителя метод hasNext() выполнит проверку с новым разделителем вместо стандартного.

Давайте посмотрим на другой пример того, как hasNext() и next() работают с пользовательским разделителем. Мы будем повторно использовать ввод из последнего примера.

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

 while (scanner.hasNext())    String token = scanner.next();   if ("dependencies:".equals(token))    scanner.useDelimiter(":");   >   log.info(token);   >  log.info("--------OUTPUT--END---------"); 

Посмотрим на результат:

[DEMO]magic [DEMO]project [DEMO]database: [DEMO]oracle [DEMO]dependencies: [DEMO] spring [DEMO]foo [DEMO]bar  [DEMO]--------OUTPUT--END--------- 

Большой! Мы успешно извлекли значения в « зависимостях », однако возникли некоторые неожиданные проблемы с переносом строки . Мы увидим, как избежать их в следующем разделе.

2.3. С регулярным выражением в качестве разделителя​

Давайте рассмотрим вывод в последнем разделе. Во-первых, мы заметили разрыв строки ( \n ) перед словом spring . Мы изменили разделитель на « : » после получения токена «dependencies:» . Разрыв строки после « зависимостей: » теперь становится частью следующего токена. Поэтому функция hasNext() вернула true , и разрыв строки был распечатан.

По той же причине перевод строки после « hibernate » и последняя пустая строка становятся частью последнего токена, поэтому вместе с « hibernate » печатаются две пустые строки .

Если мы сможем сделать двоеточие и пробел в качестве разделителя, тогда значения «зависимостей» будут правильно проанализированы, и наша проблема будет решена. Для этого изменим вызов useDelimiter(“:”) :

 scanner.useDelimiter(":|\\s+"); 

« :|\\s+ » здесь является регулярным выражением, соответствующим одному «:» или одному или нескольким пробельным символам. С этим исправлением вывод превращается в:

[DEMO]magic [DEMO]project [DEMO]database: [DEMO]oracle [DEMO]dependencies: [DEMO]spring [DEMO]foo [DEMO]bar [DEMO]--------OUTPUT--END--------- 

3. имеетСледующаяСтрока() ​

Метод hasNextLine() проверяет, есть ли другая строка во входных данных объекта Scanner , независимо от того, пуста эта строка или нет.

Давайте снова возьмем тот же ввод. На этот раз мы добавим номера строк перед каждой строкой ввода, используя методы hasNextLine() и nextLine() :

 int i = 0;   while (scanner.hasNextLine())    log.info(String.format("%d|%s", ++i, scanner.nextLine()));   >  log.info("--------OUTPUT--END---------"); 

Теперь давайте посмотрим на наш вывод:

[DEMO]1|magic project [DEMO]2| database: oracle [DEMO]3|dependencies: [DEMO]4|spring:foo:bar [DEMO]5| [DEMO]--------OUTPUT--END--------- 

Как мы и ожидали, печатаются номера строк, а также последняя пустая строка.

4. Вывод​

В этой статье мы узнали, что метод hasNextLine () Scanner проверяет, есть ли во входных данных другая строка, независимо от того, пуста она или нет, в то время как hasNext() использует разделитель для проверки наличия другого токена.

Как всегда, полный исходный код примеров доступен на GitHub.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *