Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Лекции / 7 - Презентация 2

.pdf
Скачиваний:
55
Добавлен:
25.12.2020
Размер:
772.48 Кб
Скачать

Центр дистанционного обучения

Collections Framework

XXXSet реализованы так же, как аналогичные XXXMap:

HashSet : HashMap (хэш-таблица)

LinkedHashSet : LinkedHashMap (хэш-таблица)

TreeSet : TreeMap (двоичное дерево поиска)

online.mirea.ru

Центр дистанционного обучения

Collections Framework

Связь между Map и Collection: public interface Map<K, V> {

interface Entry<K, V> { K getKey();

V getValue();

}

Set<K> keySet(); Set<Entry<K, V>> entrySet(); Collection<V> values();

}

online.mirea.ru

Центр дистанционного обучения

Collections Framework

Связь между Map и Collection: Set<K> keySet();

Так как ключи в Map уникальны, они образуют множество. Удаление из keySet отражается в Map.

Map<String, String> engRus = new HashMap<>(); engRus.put(“book”, “книга”);

Set<String> eng = engRus.keySet(); // {“book”} for (String word : eng) {

System.out.println(word); // Перечисление всех ключей

}

eng.remove(“book”); // Удаление из Map

online.mirea.ru

Центр дистанционного обучения

Collections Framework

Связь между Map и Collection: Set<Map.Entry<K, V>> entrySet();

Так как ключи в Map уникальны, то и пары (ключ, значение) уникальны, и они образуют множество. Удаление из entrySet отражается в Map.

Map<String, String> engRus = new HashMap<>(); engRus.put(“book”, “книга”);

Set<Map.Entry<String, String>> pairs = engRus.entrySet(); // {(“book”, “книга”)} for (Map.Entry<String, String> entry : pairs) {

System.out.println(entry); // Перечисление всех пар (ключ, значение)

}

pairs.clear(); // Очистка Map

online.mirea.ru

Центр дистанционного обучения

Collections Framework

Связь между Map и Collection: Collection<V> values();

Значения в Map не уникальны, поэтому это не Set; также порядок в них не определен в общем случае, поэтому это не List; это Collection. Удаление из values() отражается в Map.

Map<String, String> engRus = new HashMap<>(); engRus.put(“book”, “книга”);

Collection<String> rus = engRus.values(); // {“книга”} for (String word : rus) {

System.out.println(word); // Перечисление всех значений

}

rus.clear(); // Очистка Map

online.mirea.ru

Центр дистанционного обучения

Collections Framework

Итераторы

public interface Iterator<E> {

boolean hasNext();

E next(); // возвращает очередной элемент

}

У любой коллекции есть метод iterator(): List<String> list = ...;

Iterator<String> it = list.iterator();

online.mirea.ru

Центр дистанционного обучения

Collections Framework

Итератор позволяет обойти все элементы коллекции, но только один раз.

List<String> list = ...;

Iterator<String> it = list.iterator();

while (it.hasNext()) {

String element = it.next();

// обработка element

}

После возврата последнего элемента списка hasNext() возвращает false.

online.mirea.ru

Центр дистанционного обучения

Collections Framework

Зачем это нужно, если есть цикл for each? for (String element : list) {

...

}

На самом деле цикл for each реализован в терминах итераторов! Компилятор преобразует это в:

for (Iterator<String> it = list.iterator(); it.hasNext(); ) {

String element = it.next();

...

}

online.mirea.ru

Центр дистанционного обучения

Collections Framework

public interface Iterable<E> {

Iterator<E> iterator();

}

public interface Collection<E> extends Iterable<E> {

...

}

Цикл for each работает с любым объектом, реализующим интерфейс Iterable (то есть в том числе с любыми коллекциями).

online.mirea.ru

Центр дистанционного обучения

Collections Framework

public class ForeverIterable<E> implements Iterable<E> {

private final E value;

public ForeverIterable(E value) { this.value = value; }

public boolean hasNext() { return true; } public E next() { return value; }

}

for (String element : new ForeverIterable<>(“Hello iterable”)) {

System.out.println(element);

}

online.mirea.ru