Вложенный интерфейс Map.Entry




Этот интерфейс описывает методы работы с парами, полученными методом entrySet():

методы getKey() и getVaiue() позволяют получить ключ и значение пары; метод setVaiue(Object value) меняет значение в данной паре.

Интерфейс SortedMap

Интерфейс SortedMap, расширяющий интерфейс Map, описывает упорядоченную по ключам коллекцию мар. Сортировка производится либо в естественном порядке возрастания ключей, либо, в порядке, описываемом в интерфейсе Comparator.

Элементы не нумеруются, но есть понятия большего и меньшего из двух элементов, первого, самого маленького, и последнего, самого большого элемента коллекции. Эти понятия описываются следующими методами:

Comparator comparator () — возвращает способ упорядочения коллекции;

Object firstKey() — возвращает первый, меньший элемент коллекции;

SortedMap headMap(Object toKey) — возвращает начало коллекции до элемента с ключом toKey исключительно;

Object lastKey() — возвращает последний, больший ключ коллекции;

SprtedMap subMap (Object fromKey, Object toKey) — возвращает часть коллекции от элемента с ключом fromKey включительно до элемента с ключом toKey исключительно;

SortedMap tailMap(Object fromKey) — возвращает остаток коллекции от элемента fromKey включительно.

Вы можете создать свои коллекции, реализовав рассмотренные интерфейсы. Это дело трудное, поскольку в интерфейсах много методов. Чтобы облегчить эту задачу, в Java API введены частичные реализации интерфейсов — абстрактные классы-коллекции.

Абстрактные классы-коллекции

Эти классы лежат в пакете java.util

Абстрактный класс AbstractCollection.реализует интерфейс Collection, но оставляет нереализованными методы iterator(), size().

Абстрактный класс AbstractList реализует интерфейс List, но оставляет нереализованным метод get() и унаследованный метод size() Этот класс позволяет реализовать коллекцию с прямым доступом к элементам, подобно массиву

Абстрактный класc AbstractSequantalList реализует интерфейс List, но оставляет нереализованным метод listIterator(int index) и унаследованный метод size(). Данный класс позволяет реализовать коллекции с последовательным доступом к элементам с помощью итератора ListstIterator

Абстрактный класс AbstractSet реализует интерфейс Set, но оставляет нереализованными методы, унаследованные от AbsjractCollection.

Абстрактный класс AbstractMap реализует интерфейс Map, но оставляет нереализованным метод entrySet ().

Наконец, в составе Java API есть полностью реализованные классы-коллекции помимо уже рассмотренных классов Vectdr, Stack, Hashtable и Properties, Это классы ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, WeakHashMap.

Для работы с этими классами разработаны интерфейсы Iterator.

ListIterator, Comparator и классы Arraysи Collections.

Перед тем как рассмотреть использование данных классов, обсудим понятие итератора.

Интерфейс Iterator

В 70—80-х годах прошлого столетия, после того как была осознана важность правильной организации данных в определенную структуру, большое внимание уделялось изучению и Построению различных структур данных: связанных списков, очередей, деков, стеков, деревьев, сетей.

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

В 90-х годах было решено заносить данные в определенную коллекцию, скрыв ее внутреннюю структуру, а для работы с данными использовать методы этой коллекции.

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

В интерфейсе Iterator описаны всего три метода:

hasNext() − возвращает true, если обход еще не завершен;

next() − делает текущим следующий элемент коллекции и возвращает его в виде объекта класса Object;

remove() − удаляет текущий элемент коллекции.

Можно представить себе дело так, что итератор — это указатель на элемент коллекции. При создании итератора указатель устанавливается перед первым элементом, метод next() перемещает указатель на первый элемент и показывает его. Следующее применение метода next() перемещает указатель на второй элемент коллекции и показывает его. Последнее применение метода next() выводит указатель за последний элемент коллекции.

Метод remove(), пожалуй, излишен, он уже не относится к задаче обхода коллекции, но позволяет при просмотре коллекции удалять из нее ненужные элементы.

Пример. Использование итератора вектора

Vector v = new Vector();

String s = "Строка, которую мы хотим разобрать на слова.";

StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");

while (st.hasMoreTokens()){// Получаем слово и заносим в вектор.

v.add(st.nextToken()); // Добавляем в конец вектора

}

System.out.println(v.firstElement()); // Первый элемент

System.out.println(v.lastElement()); // Последний элемент

v.setSize(4); // Уменьшаем число элементов

v.add("собрать."); // Добавляем в конец укороченного вектора

v.set(3, "опять"); // Ставим в позицию 3

for (int i = 0; i < v.sizeO; i++) // Перебираем весь вектор

System.out.print(v.get(i) + ".");

System.out.println();

Iterator it = v.iterator (); // Получаем итератор вектора

try{

while(it.hasNext()) // Пока в векторе есть элементы,

System.out.println(it.next()); // выводим текущий элемент

} catch(Exception e){}

Интерфейс ListIterator

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

В интерфейс ListIterator добавлены следующие методы:

void add(Object element) — добавляет элемент element перед текущим элементом;

boolean hasPrevious() — возвращает true, если в коллекции есть элементы, стоящие перед текущим элементом;

int nextIndex() — возвращает индекс текущего элемента; если текущим является последний элемент коллекции, возвращает размер коллекции;

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

int previousIndex() — возвращает индекс предыдущего элемента;

void set (Object element) — заменяет текущий элемент элементом element;

выполняется сразу после next() или previous().

Как видите, итераторы могут изменять коллекцию, в которой они работают, добавляя, удаляя и заменяя элементы. Чтобы это не приводило к конфликтам, предусмотрена исключительная ситуация, возникающая при попытке использования итераторов параллельно "родным" методам коллекции. Именно поэтому в листинге 6.5 действия с итератором заключены в блок try-catch(){}.

Изменим окончание последнего примера с использованием итератора ListIterator.

ListIterator lit = v.listIterator(); //Получаем итератор вектора

// Указатель сейчас находится перед началом вектора

try{

while(lit.hasNext()) // Пока в векторе есть элементы

System.out.println(lit.next()); // Переходим к следующему

// элементу и выводим его

// Теперь указатель за концом вектора. Пройдем к началу

while (lit.hasPrevious ())

System.out.println(lit.previous());

} catch (Exception e) {}

Интересно, что повторное применение методов next() и previous() друг за другом будет выдавать один и тот же текущий элемент.: Посмотрим теперь, какие возможности предоставляют классы-коллекции Java 2.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: