Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_ООП_2010.doc
Скачиваний:
0
Добавлен:
05.02.2020
Размер:
1.81 Mб
Скачать
  1. В описании узла дерева необходимо создать и инициализировать объект ассоциативный массив сыновей, например

    class MapNode implements INode{

    //Информационные поля для узла дерева

    Map mapSon = new LinkedHashMap();

    //Методы узла дерева

    }

  2. Количество сыновей узла дерева определяется следующим образом:

    int size = mapSon.size();

  3. Добавление сына в ассоциативный массив сыновей реализуется следующим образом:

    INode node;

    node.setData( );

    mapSon.put(node.getData(), node);

  4. Доступ к сыну – элементу ассоциативного массива, с индексом i выполняется путем получения коллекции значений всех пар карты отображений, а затем массива, который содержит элементы коллекций, следующим образом:

node = (INode)mapSon.values().toArray()[i];

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

На рисунке 6.1 приведена финальная диаграмма классов. Обратите внимание на частичную реализацию функциональности в абстрактных классах.

Рисунок 6.1 – Диаграмма классов

6.2.3Доступ к коллекции или ассоциативному массиву через итератор

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

В Java итератор является специальным объектом, который реализует интерфейс Iterator.

Интерфейс Iterator позволяет циклически пройти через коллекцию, получая и удаляя ее элементы. К основным методам этого интерфейса относится:

  • Object next() – возвращает следующий элемент;

  • boolean hesNext() – возвращает true, если в коллекции есть следующий элемент;

  • void remove() – удаляет текущий элемент.

Интерфейс ListIterator расширяет Iterator, обеспечивая двунаправленный обход списка, и модификацию элементов списка. К основным методам этого интерфейса дополнительно можно отнести:

  • Object previous() – возвращает предыдущий элемент;

  • boolean hesPrevious() – возвращает true, если в коллекции есть предыдущий элемент;

  • void add(Object obj) – добавляет новый элемент перед тем, который будет возвращен следующим вызовом next().

Общую структуру использования итераторов для коллекций рассмотрим на примере циклического прохода списка:

//Получить итератор для коллекции

Iteratot iter = listSon.iterator();

//Обход коллекции в цикле

while(iter.hasNext()){

node = (INode)iter.next(); //получить элемент коллекции

… //выполнить обработку элемента

}

//или использовать цикл for

for(INode node: listSon){

System.out.println(node.getData());

}

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

//Получить множество пар ассоциативного массива

Set sons = mapSon.entrySet();

//Получить итератор для множества

Iteratot iter = sons.iterator();

//Обход множества в цикле

while(iter.hasNext()){

MapEntry me = (MapEntry)iter.next(); //получить вход карты

node = (INode)me.getValue();//получить элемент

… //выполнить обработку элемента

}

//или использовать цикл for

for(MapEntry me: sons){

System.out.println(((INode)me.getValue()).getData());

}