Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Доступ к коллекции через итератор



Часто нужно циклически проходить элементы в коллекции, например, для отображения их на экране. Самый простой способ сделать это – использовать итератор (iterator), т.е. специальный объект, который реализует один из интерфейсов – либо Iterator, либо ListIterator.

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

Таблица 5.6 Методы интерфейса Iterator

Метод Описание
booleanhasNext() Возвращает true, если в коллекции присутствует следующий элемент. Иначе возвращает false
Object next() Возвращает следующий элемент. Выбрасывает исключение типа NoSuchElementException, если следующего элемента нет
void remove() Удаляет текущий элемент. Выбрасывает исключение типа IllegalstateExceptlon, если сделана попытка вызвать метод remove(), которой не предшествует вызов next()

 

Таблица 5.7 Методы интерфейса ListIterator

Метод Описание
voidadd (Objectobj) Вставляет obj в список перед элементом, который будет возвращен следующим вызовом next()
boolean hasNext() Возвращает true, если в коллекции присутствует следующий элемент. Иначе возвращает false
boolean hasPrevious() Возвращает true, если существует предыдущий элемент. Иначе возвращает false
Object next() Возвращает следующий элемент. Выбрасывает исключение типа NoSuchElementException, если следующего элемента нет
int nextIndex() Возвращает индекс следующего элемента. Если следующего элемента нет. возвращает размер списка
Object previous() Возвращает предыдущий элемент. Выбрасывается исключение типа NoSuchElementException, если предыдущего элемента нет
int previousIndex(} Возвращает индекс предыдущего элемента. Если предыдущего элемента нет, возвращает -1
void remove() Удаляет текущий элемент из списка. Выбрасывается исключение типа IllegalStateException, если метод remove() вызывается, прежде чем вызван метод next() или previous()
void set (Object obj) Назначает obj на текущий элемент. Это последний элемент, возвращенный вызовом метода next() или previous{)

 

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

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

2.Установите цикл, который делает обращение к методу hasNext(). Повторяйте итерации, пока hasNext() возвращает true.

3.Внутри цикла, получайте каждый элемент коллекции, вызывая метод next().

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

Ниже показан пример, который реализует описанные выше действия и демонстрирует интерфейсы Iterator и ListIterstor. Он использует объект типа ArrayList, но общие принципы применимы к коллекции любого типа. Конечно, интерфейс ListIterator доступен только тем коллекциям, которые реализуют интерфейс List.

Листинг 5.17

import java.util.ArrayList;

import java.util.Iterator;

import java.util.ListIterator;

public class Main {

public static void main(String[] args) {

ArrayList al = new ArrayList();

al.add(" C" );

al.add(" A" );

al.add(" E" );

al.add(" B" );

al.add(" D" );

al.add(" F" );

// использовать итератор для показа содержимого объекта al

System.out.print(" Исходное содержимое al: " );

Iterator itr = al.iterator();

while (itr.hasNext()) {

Object element = itr.next();

System.out.print(element + " " );

}

System.out.println();

// модифицировать итерируемое объекты

ListIterator litr = al.listIterator();

while (litr.hasNext()) {

Object element = litr.next();

litr.set(element + " +" );

}

System.out.print(" Модифицированное содержимое al: " );

itr = al.iterator();

while (itr.hasNext()) {

Object element = itr.next();

System.out.print(element + " " );

}

System.out.println();

// теперь показать список в обратном порядке

System.out.print(" Модифицированный (обратный) список: " );

while (litr.hasPrevious()) {

Object element = litr.previous();

System.out.print(element + " " );

}

System.out.println();

}

}

В результате выполнения данной программы получим:

Исходное содержммое al: C A E B D F

Модифицированное содержимое al: C+ A+ E+ B+ D+ F+

Модифицированный (обратный) список: F+ D+ B+ E+ A+ C+

Алгоритмы коллекций

Структура коллекций содержит несколько алгоритмов, которые могут применяться к коллекциям. Эти алгоритмы определены как статические методы в классе collections и описаны в таблице 5.8.

Таблица 5.8 Алгоритмы класса Collections

Метод Описание
staticintbinarySearch(Listlist, Objectvalue, Comparatorc) Отыскивает объект value из списка list, упорядоченного с помощью компаратора с. Возвращает позицию value в списке list, или -1, если значение не найдено
static int binarySearch (List list, Object value) Отыскивает объект value в списке list. Список должен быть сортированным. Возвращает позицию value в Слиске list, или – 1, если значение не найдено
static void copy(List listl, List Iist2) Копирует элементы list2 в list1
static Enumeration enumeration (Collection c) Возвращает перечисление коллекции с
static void fill (List list, Object obj) Присваивает объект obj каждому элементу списка list
static Object max(Collection c, Comparator comp) Возвращает максимальный элемент коллекции с, использующей компаратор соmр
static Object max(Collection c) Возвращает максимальный элемент коллекции с, использующей естественное упорядочение. Коллекция может быть несортированной
static Object min (Collection c, Comparator comp) Возвращает минимальный элемент коллекции с, использующей компаратор соmр. Коллекция может быть несортированной
static Object min (Collection c) Возвращает минимальный элемент коллекции с, использующей естественное упорядочение
static List nCopies(int num, Object obj) Возвращает num копий объекта obj в форме неизменяемого списка, num должен быть больше или равен нулю
static void reverse (List list) Реверсирует последовательность списка list
staticComparatorreverseOrder() Возвращает обратный компаратор (компаратор, который реверсирует вывод результата сравнения двух элементов)
static void shuffle(List list, Random r) Перетасовывает (т. е. рандомизирует) элементы в списке list, используя r как источник случайных чисел
static void shuffle(List list) Перетасовывает (т. е. рандомизирует) элементы в списке list (с рандомизатором по умолчанию)
static Set singleton(Object obj) Возвращает obj как неизменяемый набор. Это простой способ преобразования одиночного объекта в набор
static void sort(List list, Comparator comp) Сортирует элементы списка list по правилам компаратора соmp
static void sort(List list) Сортирует элементы списка list в естественном порядке
static Collection synchronizedCollection (Collection c) Возвращает синхронизированную (поточно-безопасную) коллекцию, поддерживаемую коллекцией с
static List synchronizadList (List list) Возвращает синхронизированный (поточно-безопасный) список, поддерживаемый списком list
static Map synchrorizedMap(Map m) Возвращает синхронизированную (поточно-безопасную карту) отображений, поддерживаемую картой m
static Set synchronizedSet(Set s) Возвращает синхронизированный (поточно-безопасный) набор, поддерживаемый набором s
static SortedMap synchronizedSortedMap (SortedMap sm) Возвращает синхронизированную (поточно-безопасную) отсортированную карту, поддерживаемую отсортированной картой sm
staticSortedSet synchxonizedSortedSat(SortedSet ss) Возвращает синхронизированный (поточно-безопасный) отсортированный набор, поддерживаемый отсортированным набором ss
staticCollection unmodifiableCollection (Collection c) Возвращает неизменяемую коллекцию, поддерживаемую коллекцией с
static List unmodifiableList (List list) Возвращает неизменяемый список, поддерживаемый списком list
static Map unmodifiableMap (Map m) Возвращает неизменяемую карту отображений, поддерживаемую картой m
static Set unmodifiableSet (Set a) Возвращает неизменяемый набор, поддерживаемый набором s
static SortedMap unmodifiableSortedMap (SortedMap sm) Возвращает неизменяемую отсортированную карту отображений, поддерживаемую отсортированной картой sm
static SortedSet unmodifiableSortedSet(SortedSet ss) Возвращает неизменяемый отсортированный набор, поддерживаемый отсортированным набором ss

 

Некоторые из методов могут выбрасывать исключения ClassCastException, которые происходят при попытке сравнения несовместимых типов, или исключения UnsupportedOperationException, возникающие во время изменения неизменяемой коллекции.

Коллекции представляют собой обширную группу классов дающих много возможностей для хранения и обработки объектов. В рамках данного методического пособия была рассмотрена лишь малая часть этих классов. Рекомендуем продолжить изучение классов коллекций по документации.

 

Выводы к главе:

· Универсальные типы – это совершенно новая синтаксическая конструкция, появление которой вызвало существенные изменения во многих классах и методах базового API.

· Универсальные типы позволяют создавать классы, интерфейсы и методы, для которых типы обрабатываемых данных передаются в качестве параметра.

· Классы, интерфейсы или методы, которые обрабатывают типы, передаваемые посредством параметров, называются универсальными.

· При определении экземпляра универсального класса передаваемый тип, который заменяет параметр типа, должен быть именем класса. Для этой цели нельзя использовать простой тип, например int или char.

· Групповой параметр можно ограничить при помощи ключевого слова extends.

· Класс может содержать несколько параметров одновременно.

· Не параметризированный класс может содержать один или несколько параметризированных методом. Конструктор может быть параметризирован.

· В параметризированном классе не может быть статических полей и методов использующих параметр.

· Универсальный класс не может расширять класс Throwable. Это означает, что создать универсальный класс исключения невозможно.

· Коллекция – это группа объектов.

· Интерфейс Collection – это основа, на которой сформирована структура коллекций. В нем объявляются основные методы, которые будут наследоваться всеми коллекциями.

· Алгоритмы – важная часть механизма коллекций. Алгоритмы работают на коллекциях и определены как статические методы в классе Collections.

 

Задания к главе:

 

1). Напишите класс Student, предоставляющий информацию об имени студента методом getName() и о его курсе методом getCourse(). Напишите метод printStudents(LinkedList students, int course), который получает список студентов и номер курса и печатает в консоль имена тех студентов из списка, которые обучаются на данном курсе.Протестируйте ваш метод (для этого предварительно придется создать десяток объектов класса Student и поместить их в список).Напишите методы union(LinkedList set1, LinkedList set2) и intersect(LinkedList set1, LinkedList set2), реализующих операции объединения и пересечения двух множеств. Протестируйте работу этих методах на двух предварительно заполненных множествах. (Вам понадобится написать вспомогательный метод, выводящий все элементы множества на консоль.)Реализуйте интерфейс Comparable так, чтобы студенты сортировались по номеру курса. Проверить работу, используя класс TreeSet.

2).Не используя вспомогательных объектов, переставить отрицательные элементы данного списка в конец, а положительные - в начало этого списка.

3). В кругу стоят N человек, пронумерованных от 1 до N. При ведении счета по кругу вычеркивается каждый второй человек, пока не останется один. Составить две программы, моделирующие процесс. Одна из программ должна использовать класс ArrayList, а вторая - LinkedList.

4). Задан список целых чисел и число X. Не используя вспомогательных объектов и не изменяя размера списка, переставить элементы списка так, чтобы сначала шли числа, не превосходящие X, а затем числа, большие X.

5). Выполнить попарное суммирование произвольного конечного ряда чисел по следующим правилам: на первом этапе суммируются попарно рядом стоящие числа, на втором этапе суммируются результаты первого этапа и т.д. до тех пор, пока не останется одно число.

6). На базе коллекций реализовать структуру хранения чисел с поддержкой следующих операций:

• добавление/удаление числа;

• поиск числа, наиболее близкого к заданному (т.е. модуль разницы минимален).

 


Поделиться:



Популярное:

  1. A. Смещение суставной головки через вершину суставного бугорка на передний его скат
  2. F) показывает, во сколько раз увеличивается денежная масса при прохождении через банковскую систему
  3. А то, что есть, — это единственное подлинное имя Бога. Это не цель где-то еще; это всегда доступно, просто вы не доступны этому.
  4. А. Операция ПХО выполнена через 6 часов после ранения
  5. Алгоритм введения желудочного зонда через рот
  6. Архангел Михаил, пожалуйста, приди сейчас ко мне и обрежь шнуры страха, через которые из меня вытекает энергия и жизненная сила.
  7. В каких местах запрещено пешеходу переходить через дорогу?
  8. В ночь на 8 сентября 1514 г. литовская конница переправилась вплавь через Днепр и прикрыла наводку мостов для пехоты. Утром все литовское войско было уже на левом берегу реки.
  9. Взаимодействия между родителями и дитя идут через корни
  10. Возможный подход к управлению доступом в распределенной объектной среде
  11. Воспитание в коллективе и через коллектив
  12. Воспитание через Service Learning


Последнее изменение этой страницы: 2016-05-30; Просмотров: 1029; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.039 с.)
Главная | Случайная страница | Обратная связь