Реализация своего итератора java

Можем ли мы написать свой собственный итератор на Java?

Если у меня есть список, содержащий [alice, bob, abigail, charlie] , и я хочу написать итератор, чтобы он повторял элементы, начинающиеся с «a», могу ли я написать свой собственный? Как я могу это сделать?

конечно, это просто нормальный интерфейс. Прокси java.util для JDO вкл. включает в себя довольно много пользовательских итераторов.

4 ответа

Конечно. Итератор — это просто реализация интерфейса java.util.Iterator . Если вы используете существующий итерируемый объект (например, LinkedList ) из java.util , вам нужно либо подклассировать его, либо переопределить его функцию iterator , чтобы вы вернули свой собственный или предоставили средство для обертывания стандартный итератор в вашем специальном экземпляре iterator (который имеет то преимущество, что его более широко используют) и т.д.

хороший ответ . +1 Однако вы не обязаны создавать подкласс LinkedList. Вы можете написать CustomIterator, для которого он создан, с помощью нового CustomIterator (somelist), поскольку интерфейсы ничего не говорят о конструкторах.

@Giacomo: Это то, что я имел в виду под «. или предоставить средство оборачивания стандартного итератора в ваш специальный экземпляр Iterator . » (и спасибо). 🙂

Лучшим вариантом многократного использования является реализация интерфейса Iterable и переопределение метода iterator().

Вот пример класса ArrayList, реализующего интерфейс, в котором вы переопределяете метод Iterator().

import java.util.Iterator; public class SOList implements Iterable  < private Type[] arrayList; private int currentSize; public SOList(Type[] newArray) < this.arrayList = newArray; this.currentSize = arrayList.length; >@Override public Iterator iterator() < Iteratorit = new Iterator() < private int currentIndex = 0; @Override public boolean hasNext() < return currentIndex < currentSize && arrayList[currentIndex] != null; >@Override public Type next() < return arrayList[currentIndex++]; >@Override public void remove() < throw new UnsupportedOperationException(); >>; return it; > > 

Этот класс реализует интерфейс Iterable, используя Generics. Учитывая, что у вас есть элементы массива, вы сможете получить экземпляр Iterator, который является необходимым экземпляром, используемым, например, циклом foreach.

Вы можете просто создать анонимный экземпляр итератора без создания расширения Iterator и воспользоваться значением currentSize, чтобы проверить, где вы можете перемещаться по массиву (предположим, вы создали массив емкостью 10, но вы имеют только 2 элемента в 0 и 1). У экземпляра будет свой счетчик владельца, где он есть, и все, что вам нужно сделать, это сыграть с hasNext(), который проверяет, не текущее значение не равно null, и next(), которое вернет экземпляр вашего currentIndex. Ниже приведен пример использования этого API.

public static void main(String[] args) < // create an array of type Integer Integer[] numbers = new Integer[]; // create your list and hold the values. SOList stackOverflowList = new SOList(numbers); // Since our class SOList is an instance of Iterable, then we can use it on a foreach loop for(Integer num : stackOverflowList) < System.out.print(num); >// creating an array of Strings String[] languages = new String[]; // create your list and hold the values using the same list implementation. SOList languagesList = new SOList(languages); System.out.println(""); // Since our class SOList is an instance of Iterable, then we can use it on a foreach loop for(String lang : languagesList) < System.out.println(lang); >> // will print "12345 //C //C++ //Java //Python //Scala 

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

// navigating the iterator while (allNumbers.hasNext()) < Integer value = allNumbers.next(); if (allNumbers.hasNext()) < System.out.print(value + ", "); >else < System.out.print(value); >> // will print 1, 2, 3, 4, 5 

Документация foreach находится в http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html. Вы можете взглянуть на более полную реализацию в моей личной практике код google.

Читайте также:  Java pengrad telegram bot full example

Теперь, чтобы получить эффект от того, что вам нужно, я думаю, вам нужно подключить концепцию фильтра в Iterator. Поскольку итератор зависит от следующих значений, было бы трудно вернуть true на hasNext(), а затем отфильтруйте реализацию next() со значением, которое не начинается с char «a», например. Я думаю, вам нужно играть со вторичным Interator на основе отфильтрованного списка со значениями с данным фильтром.

Источник

Паттерн Iterator

Java-университет

Как ты уже, вероятно, знаешь, в Java есть замечательный интерфейс Collection, реализующий интерфейс Iterator. Сразу оговорюсь, не следует путать интерфейс iterator с паттерном iterator в Java! И дабы внести ясность, для начала разберёмся именно с интерфейсом.

Дословно «Iterator» можно перевести как «переборщик». То есть это некая сущность, способная перебрать все элементы в коллекции. При этом она позволяет это сделать без вникания во внутреннюю структуру и устройство коллекций.

Представим на секунду, что iterator в Java отсутствует. В таком случае всем и каждому придётся нырнуть в самые глубины коллекций и по-настоящему разобраться, чем отличается, ArrayList от LinkedList и HashSet от TreeSet .

Методы, которые должен имплементировать Iterator

  • UnsupportedOperationException , если данный итератор не поддерживает метод remove() (в случае с read-only коллекциями, например)
  • IllegalStateException , если метод next() еще не был вызван, или если remove() уже был вызван после последнего вызова next() .
  • void add(E e) — вставляет элемент E в List ;
  • boolean hasPrevious() — вернет true , если при обратном переборе List имеются элементы;
  • int nextIndex() — вернет индекс следующего элемента;
  • E previous() — вернет предыдущий элемент листа;
  • int previousIndex() — вернет индекс предыдущего элемента;
  • void set(E e) — заменит элемент, возвращенный последним вызовом next() или previous() на элемент e .
 List list = new ArrayList<>(); list.add("Привет"); list.add("Обучающимся"); list.add("На"); list.add("JavaRush"); 
 Iterator iterator = list.iterator(); while (iterator.hasNext())

Сейчас будет «узкое место»: Java Collections как ты, вероятно, знаешь (а если не знаешь, разберись), расширяют интерфейс Iterable , но это не означает, что только List , Set и Queue поддерживают итератор. Для java Map iterator также поддерживается, но его необходимо вызывать для Map.entrySet() :

 Map map = new HashMap<>(); Iterator mapIterator = map.entrySet().iterator(); 

Тогда метод next() будет возвращать объект Entry , содержащий в себе пару «ключ»-«значение». Дальше все аналогично с List :

 while (mapIterator.hasNext()) < Map.Entryentry = mapIterator.next(); System.out.println("Key: " + entry.getKey()); System.out.println("Value: " + entry.getValue()); > 

Ты думаешь: «Стоп. Мы говорим про интерфейс, а в заголовке статьи написано «Паттерн». То есть, паттерн iterator – это интерфейс Iterator? Или интерфейс — это паттерн?» Если это слово встречается впервые, даю справку: паттерн — это шаблон проектирования, некое поведение, которого должен придерживаться класс или множество взаимосвязанных классов. Итератор в java может быть реализован для любого объекта, внутренняя структура которого подразумевает перебор, при этом можно изменить сигнатуру обсуждаемых методов. Главное при реализации паттерна – логика, которой должен придерживаться класс. Интерфейс итератор – частная реализация одноименного паттерна, применяемая как к готовым структурам ( List, Set, Queue, Map ), так и к прочим, на усмотрение программиста. Расширяя интерфейс Iterator, ты реализуешь паттерн, но для реализации паттерна не обязательно расширять интерфейс. Простая аналогия: все рыбы плавают, но не всё, что плавает – рыбы. В качестве примера я решил взять… слово. А конкретнее — существительное. Оно состоит из частей: приставки, корня, суффикса и окончания. Для частей слова создадим интерфейс WordPart и классы, расширяющие его: Prefix, Root, Suffix и Ending :

 interface WordPart < String getWordPart(); >static class Root implements WordPart < private String part; public Root(String part) < this.part = part; >@Override public String getWordPart() < return part; >> static class Prefix implements WordPart < private String part; public Prefix(String part) < this.part = part; >@Override public String getWordPart() < return part; >> static class Suffix implements WordPart < private String part; public Suffix(String part) < this.part = part; >@Override public String getWordPart() < return part; >> static class Ending implements WordPart < private String part; public Ending(String part) < this.part = part; >@Override public String getWordPart() < return part; >> 

Тогда класс Word (слово) будет содержать в себе части, а кроме них добавим целое число, отражающее количество частей в слове:

 public class Word < private Root root; private Prefix prefix; private Suffix suffix; private Ending ending; private int partCount; public Word(Root root, Prefix prefix, Suffix suffix, Ending ending) < this.root = root; this.prefix = prefix; this.suffix = suffix; this.ending = ending; this.partCount = 4; >public Word(Root root, Prefix prefix, Suffix suffix) < this.root = root; this.prefix = prefix; this.suffix = suffix; this.partCount = 3; >public Word(Root root, Prefix prefix) < this.root = root; this.prefix = prefix; this.partCount = 2; >public Word(Root root) < this.root = root; this.partCount = 1; >public Root getRoot() < return root; >public Prefix getPrefix() < return prefix; >public Suffix getSuffix() < return suffix; >public Ending getEnding() < return ending; >public int getPartCount() < return partCount; >public boolean hasRoot() < return this.root != null; >public boolean hasPrefix() < return this.prefix != null; >public boolean hasSuffix() < return this.suffix != null; >public boolean hasEnding()

Окей, у нас есть четыре перегруженных конструктора (для простоты, предположим, что суффикс у нас может быть только один). Существительное не может состоять из одной приставки, поэтому для конструктора с одним параметром будем устанавливать корень. Теперь напишем реализацию паттерна итератор: WordIterator, переопределяющий 2 метода: hasNext() и next() :

 public class WordIterator implements Iterator  < private Word word; private int wordPartsCount; public WordIterator(Word word) < this.word = word; this.wordPartsCount = word.getPartCount(); >@Override public boolean hasNext() < if (wordPartsCount == 4) < return word.hasPrefix() || word.hasRoot() || word.hasSuffix() || word.hasEnding(); >else if (wordPartsCount == 3) < return word.hasPrefix() || word.hasRoot() || word.hasSuffix(); >else if (wordPartsCount == 2) < return word.hasPrefix() || word.hasRoot(); >else if (wordPartsCount == 1) < return word.hasRoot(); >return false; > @Override public Word.WordPart next() throws NoSuchElementException < if (wordPartsCount try < if (wordPartsCount == 4) < return word.getEnding(); >if (wordPartsCount == 3) < return word.getSuffix(); >if (wordPartsCount == 2) < return word.getPrefix(); >return word.getRoot(); > finally < wordPartsCount--; >> > 
 public class Word implements Iterable < … @Override public Iteratoriterator() < return new WordIterator(this); >… > 

Источник

Читайте также:  Вывести размер файла python

Custom Iterator in Java with Example

Through this blog, I will be sharing how can we make a custom iterator in Java. Iterators can come in handy in many situations. An iterator is basically an object which can help us to go over a collection, it can serve as an alternative to foreach loop. So let’s explore more about custom iterators and their functionality.

Custom Iterators are made when we take a class that is implementing iterator and then we override the functions. Majorly we override the hasNext(), next(), and remove() functions.

Let us see the below code example for better understanding.

customiterator.java

Code Explanation:

In the above program, we are taking a class named a custom iterator along with creating an ArrayList by default. The constructor of the class creates an empty ArrayList in which we can insert values. Then we are creating a function named as add through which we will be adding values inside the ArrayList.

Then we are creating a function named as iterator under which we are calling MyIterator class.

The main code is present inside the MyIterator class. The constructor of this class initializes a variable “index” as 0. Then we are creating a hasNext() function, which will be responsible for telling whether we have reached at the end or not. At last, we are creating the next() function, which prints the current element and increases the index by 1.

Testing.java

Источник

Реализация своего Iterator

у меня есть свой односвязный список, если задать при описании итератора параметр типа Node что-то типа:

public class MyListIteratorMyNode> impliments IteratorMyNode> { //тут реализация методов Iterator'a }

но в реализации я не могу получить доступ к методам из MyNode чтобы реализовывать те самые методы, видимо потому что это просто параметр. как лучше тогда сделать?

Для чего написано: Iterator it = people.iterator(); — Java SE
package com.company; import java.util.ArrayList; import java.util.Iterator; public class Main

Реализация своего ArrayList
Привет. Проблема следующая: надо реализовать свой вариант ArrayList. Столкнулся с проблемой.

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

Реализация своего ArrayList
Парни всем привет! Решаю задачу в написании своего ArrayList для учебы. Посмотрите пожалуйста и.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
public class SOListType> implements IterableType> { private Type[] arrayList; private int currentSize; public SOList(Type[] newArray) { this.arrayList = newArray; this.currentSize = arrayList.length; } @Override public IteratorType> iterator() { IteratorType> it = new IteratorType>() { private int currentIndex = 0; @Override public boolean hasNext() { return currentIndex  currentSize && arrayList[currentIndex] != null; } @Override public Type next() { return arrayList[currentIndex++]; } @Override public void remove() { throw new UnsupportedOperationException(); } }; return it; } }

ЦитатаСообщение от Kartopet Посмотреть сообщение

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

Iterator своего класса
Не могу понять как сделать генератор своего класса что бы потом использовать в foreach. Максимум.

Реализация своего дефрагментатора
Привет всем! Подскажите, пожалуйста, возможно ли средствами .NET (C# или VB) сделать свой.

Источник

Оцените статью