2014-01-06 4 views
0

У меня есть домашнее задание, и есть одна вещь, которую я не могу получить.Домашнее задание: метод Итератора, который использует частный класс итератора

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

Все другие методы в этом классе делают разные вещи с массивами (например, добавляет или удаляет определенное целое число). Некоторые другие методы создают стек LiFo (push, pop, peek, надеюсь, вы знаете, что я имею в виду). Но у меня нет никаких проблем с другими методами это только эта один я не понимаю:

/*This is a method which I can use in my subclass and main method: */ 
public Iterator<Integer> iterator() { 
    return new IntIterator(); 
} 


/*This is a private inner class used by iterator() */ 
class IntIterator implements Iterator<Integer> { 
    private int count = 0; 
    public Integer next() {return values[count++];} 

    public boolean hasNext() {return count<size;} 

    public void remove() { 
     throw new RuntimeException("remove() is not implemented"); 
    } 
} 

«Размер» variale представляет собой фактический массив или размер стека, «ценность» представляет собой массив, который хранит все целые числа.

Заранее спасибо.

+1

Вы не понимаете метод 'iterator()'? Как насчет этого вы не понимаете? –

+1

Что вы не понимаете о коде, который вы опубликовали? Частный внутренний класс кажется относительно простым. Что насчет этого смущает? –

+0

Приятно видеть вопрос «домашней работы», который вежлив и хорошо написан. – Ivan

ответ

0

Этот код создает простой итератор для перебора массива под названием values. Итератор просто позволяет вам использовать коллекцию немного проще. Вместо этого:

for (int i = 0; i < values.size; i++) 
{ 
    System.out.println(values[i]); 
} 

вы это делаете:

Iterator i = iterator(); 
while (i.hasNext()) { 
    System.out.printf(i.next()); 
} 

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

0

Цель метода iterator, вероятно, должна предоставить материал, необходимый для использования с оператором for. Если вы говорите что-то вроде

for (SomeType val : SomeObject) 

тогда, если SomeObject не является массивом, оно должно быть что-то, что реализует Iterable<SomeType> [технически это можно реализовать только Iterable или Iterable<T> для некоторого подкласса SomeType]. Если класс реализует Iterable<SomeType>, он должен иметь iterator метод:

public Iterator<SomeType> iterator() { ... } 

Когда выше for выполняется оператор, он начинает с создания Iterator<SomeType>:

internalIterator = SomeObject.iterator(); 

for оператор затем вызывает next и hasNext на internalIterator, чтобы проверить каждый объект по очереди и знать, когда остановить цикл. Таким образом, Iterator<SomeType> имеет метод next, который будет возвращать «следующее» значение каждый раз, когда он вызывается. Фактически, вызов next несколько раз возвращает лист значений, по одному. В этом случае Iterator<Integer> содержит индекс count, который сообщает ему, какое значение следует возвращать дальше, а его метод возвращает следующее значение.

Смежные вопросы