3-й семестр / Лекции / 7 - Презентация 2
.pdfЦентр дистанционного обучения
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