русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Collection и Iterator


Дата добавления: 2015-06-12; просмотров: 626; Нарушение авторских прав


Collection — корневой интерфейс, описывающий общую функциональность всех последовательных контейнеров. Его можно рассматривать как «вторичный интерфейс», появившийся вследствие сходства между другими интерфейсами. Кроме того, классjava.util.AbstractCollection предоставляет реализацию Collection по умолчанию, поэтому вы можете создать новый подтип AbstractCollection без избыточного дублирования кода.

Один из доводов в пользу интерфейсов заключается в том, что они позволяют создавать более универсальный код. Код, написанный для интерфейса, а не для его реализации, может быть применен к более широкому кругу объектов. Таким образом, если я пишу метод, которому при вызове передается Collection, этот метод будет работать с любым типом, реализующим Collection, — следовательно, если новый класс реализует Collection, он будет совместим с моим методом. Однако интересно заметить, что стандартная библиотека C++ не имеет общего базового класса для своих контейнеров — вся общность контейнеров обеспечивается итераторами. Казалось бы, в Java будет логично последовать примеру C++ и выражать сходство между контейнерами при помощи итераторов, а не Collection. Тем не менее эти два подхода взаимосвязаны, потому что реализация Collection также означает поддержку метода iterator():

//: holding/InterfaceVsIterator.java

import typeinfo.pets.*;

import java.util.*;

 

public class InterfaceVsIterator {

public static void display(Iterator<Pet> it) {

while(it.hasNext()) {

Pet p = it.next();

System.out.print(p.id() + ":" + p + " ");

}

System.out.println();

}

public static void display(Collection<Pet> pets) {

for(Pet p : pets)

System.out.print(p.id() + ":" + p + " ");

System.out.println();

}

public static void main(String[] args) {



List<Pet> petList = Pets.arrayList(8);

Set<Pet> petSet = new HashSet<Pet>(petList);

Map<String,Pet> petMap =

new LinkedHashMap<String,Pet>();

String[] names = ("Ralph, Eric, Robin, Lacey, " +

"Britney, Sam, Spot, Fluffy").split(", ");

for(int i = 0; i < names.length; i++)

petMap.put(names[i], petList.get(i));

display(petList);

display(petSet);

display(petList.iterator());

display(petSet.iterator());

System.out.println(petMap);

System.out.println(petMap.keySet());

display(petMap.values());

display(petMap.values().iterator());

}

}

<spoiler text="Output:">

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

4:Pug 6:Pug 3:Mutt 1:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

4:Pug 6:Pug 3:Mutt 1:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat

{Ralph=Rat, Eric=Manx, Robin=Cymric, Lacey=Mutt, Britney=Pug, Sam=Cymric, Spot=Pug, Fluffy=Manx}

[Ralph, Eric, Robin, Lacey, Britney, Sam, Spot, Fluffy]

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

</spoiler> Обе версии display() работают как с объектами Map, так и с подтипами Collection; при этом как Collection, так и Iterator изолируют методы display() от знания конкретной реализации используемого контейнера. В данном случае два решения примерно равноценны. Использование Iterator становится предпочтительным при реализации постороннего класса, для которого реализация интерфейса Collection затруднена или нежелательна. Например, если мы создаем реализацию Collection наследованием от класса, содержащего объектыPet, нам придется реализовать все методы Collection, даже если они не будут использоваться в методе display(). Хотя проблема легко решается наследованием от AbstractCollection, вам все равно придется реализовать iterator() вместе с size(), чтобы предоставить методы, не реализованные AbstractCollection, но используемые другими методами AbstractCollection:

//: holding/CollectionSequence.java

import typeinfo.pets.*;

import java.util.*;

 

public class CollectionSequence

extends AbstractCollection<Pet> {

private Pet[] pets = Pets.createArray(8);

public int size() { return pets.length; }

public Iterator<Pet> iterator() {

return new Iterator<Pet>() {

private int index = 0;

public boolean hasNext() {

return index < pets.length;

}

public Pet next() { return pets[index++]; }

public void remove() { // Not implemented

throw new UnsupportedOperationException();

}

};

}

public static void main(String[] args) {



CollectionSequence c = new CollectionSequence();

InterfaceVsIterator.display(c);

InterfaceVsIterator.display(c.iterator());

}

}

<spoiler text="Output:">

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

</spoiler> Метод remove() является необязательной операцией. В нашем примере реализовывать его не нужно, и в случае вызова он выдает исключение. Из приведенного примера видно, что при реализации Collection вы также реализуете iterator(), а простая отдельная реализация iterator() требует чуть меньших усилий, чем наследование от AbstractCollection. Но, если класс уже наследует от другого класса, наследование еще и от AbstractCollection невозможно. В этом случае для реализации Collection придется реализовать все методы интерфейса, и тогда гораздо проще ограничиться наследованием и добавить возможность создания итератора:

//: holding/NonCollectionSequence.java

import typeinfo.pets.*;

import java.util.*;

 

class PetSequence {

protected Pet[] pets = Pets.createArray(8);

}

 

public class NonCollectionSequence extends PetSequence {

public Iterator<Pet> iterator() {

return new Iterator<Pet>() {

private int index = 0;

public boolean hasNext() {

return index < pets.length;

}

public Pet next() { return pets[index++]; }

public void remove() { // Not implemented

throw new UnsupportedOperationException();

}

};

}

public static void main(String[] args) {



NonCollectionSequence nc = new NonCollectionSequence();

InterfaceVsIterator.display(nc.iterator());

}

}

<spoiler text="Output:">

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

</spoiler> Создание Iterator обеспечивает минимальную логическую привязку между последовательностью и методом, использующим эту последовательность, а также налагает гораздо меньше ограничений на класс последовательности, реализующий Collection.

 



<== предыдущая лекция | следующая лекция ==>
PriorityQueue | Синтаксис foreach и итераторы


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.355 сек.