Паттерн проектирования Iterator
Преимущество использования массивов и коллекций заключается не только в том, что можно поместить в них произвольное количество объектов и извлекать их при необходимости, но и в том, что все эти объекты можно комплексно обрабатывать. Например, вывести на экран все шашки, содержащиеся в списке checkers. В случае массива мы пользуемся циклом for:
for (int i = 1; i < array.length; i++){
// обрабатываем элемент array[i]
}
Имея дело со списком, мы можем поступить аналогичным образом, только вместо array[i] писать array.get(i). Но мы не можем поступить так с коллекциями, элементы которых не индексируются (например, очередью или множеством). А в случае индексированной коллекции надо хорошо знать особенности ее работы: как определить количество элементов, как обратиться к элементу по индексу, может ли коллекция быть разреженной (т.е. могут ли существовать индексы, с которыми не связано никаких элементов) и т.д.
В программировании существует несколько испытанных временем и детально проработанных приемов структурной организации программы, называемых паттернами (шаблонами) проектирования. Один из таких паттернов называется Iterator. Идея заключается в том, что к коллекции «привязывается» объект, единственное назначение которого – выдать все элементы этой коллекции в некотором порядке, не раскрывая ее внутреннюю структуру.
В пакете java.util описан интерфейс Iterator, воплощающий этот паттерн проектирования. Он имеет всего три метода:
next() – возвращает очередной элемент коллекции, к которой «привязан» итератор (и делает его текущим). Порядок перебора определяет сам итератор.
hasNext() – возвращает true, если перебор элементов еще не закончен.
remove() – удаляет текущий элемент
Интерфейс Collection помимо рассмотренных ранее методов, имеет метод iterator(), который возвращает итератор для данной коллекции, готовый к ее обходу. С помощью такого итератора можно обработать все элементы любой коллекции следующим простым способом:
Iterator iter = coll.iterator(); // coll – коллекция, элементы которой необходимо обработать
while (iter.hasNext()) {
// обрабатываем объект, возвращаемый методом iter.next()
}
Для коллекций, элементы которых проиндексированы, определен более функциональный итератор, позволяющий двигаться как в прямом, так и в обратном направлении, а также добавлять в коллекцию элементы. Такой итератор имеет интерфейс ListIterator, унаследованный от интерфейса Iterator и дополняющий его следующими методами:
previous() – возвращает предыдущий элемент (и делает его текущим);
hasPrevious() – возвращает true, если предыдущий элемент существует (т.е. текущий элемент не является первым элементом для данного итератора);
add(Object item) – добавляет новый элемент перед текущим элементом;
set(Object item) – заменяет текущий элемент;
nextIndex() и previousIndex() – служат для получения индексов следующего и предыдущего элементов соответственно.
В интерфейсе List определен метод listIterator(), возвращающий итератор ListIterator для обхода данного списка.
Класс LinkedList
LinkedList – двунаправленный список, реализующий интерфейсы List и Queue.
Классы-множества
Класс HashSet реализует интерфейс Set. Он применяется в тех случаях, когда надо хранить только одну копию каждого элемента. Одинаковые объекты «вычисляются» с помощью метода hashCode() класса Object, который должен возвращать разные значения для разных объектов.
Класс LinkedHashSet – множество, элементы которого хранятся в виде двунаправленного списка. Его наследник, класс TreeSet является упорядоченным множеством, которое хранится в виде бинарного дерева, что обеспечивает быстроту поиска нужного элемента. TreeSet реализует интерфейс SortedSet.
Дата добавления: 2017-01-26; просмотров: 1333;