2013-09-04 3 views
5

Я немного смущен тем, как реализовать пользовательский итератор для класса в Java. Я должен по существу сделать ArrayList без использования встроенных библиотек, уже доступных мне. Я понимаю основы создания класса, но у меня возникли проблемы с пониманием того, как заставить Iterator вписаться во все это. У меня есть следующий:Создание пользовательской Iterator Java?

Я создал универсальный класс, который реализует интерфейс итератора как таковые, он выглядит примерно так:

public class MyArrayList<T> implements Iterable<T> { 

Я тогда получил создать класс под названием MyIterator, который в соответствии с формулировка документа является самостоятельным классом. Это кажется довольно прямо вперед, я сделать новый класс MyIterator и он реализует интерфейс итератора, так это выглядит примерно так:

public class MyIterator<T> implements Iterator<T>{ 

Моя путаница заключается в следующем. В документе говорится, что Iterator должен быть в своем собственном классе, но как тогда я могу получить доступ к элементам данных в «MyArrayList», чтобы полностью реализовать hasNext() и next(), например. Поскольку члены данных в базовом массиве являются частными (как и должно быть), я не вижу, как внешний класс может полностью реализовать эти методы. Я не понимаю, что требуется? По отдельному классу он все еще является частью класса «MyArrayList», но определяется по-разному?

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

+0

'MyArrayList # iterator()' возвращает 'новый MyIterator (это)' или каким-то образом передает ссылку на себя и тем самым дает доступ к данным – zapl

+0

Итак, MyIterator является частью класса MyArrayList или обычно он входит в его собственный , вот где я в замешательстве, я не совсем знаю «где» Итератор идет, если это имеет смысл. Я знаю, что должен делать метод iterator(), но я не знаю, где я должен добавить код для своего пользовательского итератора, чтобы он мог создать экземпляр и вызвать его, когда он мне понадобится. – Scott

ответ

6

Хотя итератор должен быть отдельным классом *, этот класс, вероятно, будет иметь отношение к вашему классу Iterable.

Это часто является вложенным/внутренним классом, именно потому, что ему нужно получить доступ к значениям класса (и это то, что в значительной степени делают внутренние классы).

Конечно, если Iterable является List вы могли бы реализовать Iterator без какого-либо «внутреннего» доступа на всех, но обычно все еще хочет, чтобы получить доступ к внутренним для таких вещей, как проверяя modCount (бросить ConcurrentModificationException, когда Iterable структурно модифицирован, пока вы перебираете его ... и до предотвратите это, если вы измените его самостоятельно через Iterator).

* Вы могли реализовать его с самого Iterable например, но это нарушило бы договор, как только пользователь использует два итератора одновременно.

+0

Поэтому в основном я хочу иметь создать похожее на следующее: общественный класс MyArrayList реализует Iterable { класс MyIterator общественного реализует итератор { }} EDIT: К сожалению, я не могу работать как заставить форматирование кода работать в комментариях. – Scott

+0

@gRnt Точно - реализация итератора может/должна быть частным классом, хотя никто не должен видеть класс. PS: введите код в ', чтобы получить его форматирование в тексте. http://stackoverflow.com/editing-help#comment-formatting – zapl

+0

Thankyou Я думаю, я сбивал с толку «это собственный класс», не будучи вложенным классом! – Scott

1

Необходимо авторизоваться hasNext(), next(), remove(). Он должен знать, как перебирать ваш собственный класс, как перейти к следующему элементу и как проверить, существует ли следующий элемент.