3-й семестр / Лекции / 7 - Презентация 2
.pdfЦентр дистанционного обучения
Collections Framework
Добавление существующих элементов во множество не меняет его:
Set<String> s1 = new HashSet<>(); boolean added1 = s1.add(“A”); // true boolean added2 = s1.add(“A”); // false
int n = s1.size(); // 1
Метод add возвращает true, если коллекция была изменена (для списка это всегда так, для множества – только если такого элемента еще не было).
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Порядок элементов в HashSet можно считать случайным:
Set<String> s1 = new HashSet<>(); s1.add("AAAAAAAAAAAAAAAAAAA1"); s1.add("BBBBBBBBBBBBBBBBBBB2");
for (String e : s1) { System.out.println(e);
}
//BBBBBBBBBBBBBBBBBBB2
//AAAAAAAAAAAAAAAAAAA1
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Для сохранения порядка можно использовать LinkedHashSet – он хранит элементы в том порядке, в каком они в него добавлялись:
Set<String> s1 = new LinkedHashSet<>();
s1.add("AAAAAAAAAAAAAAAAAAA1");
s1.add("BBBBBBBBBBBBBBBBBBB2");
for (String e : s1) { |
|
|
LinkedHashSet использует |
||
|
||
System.out.println(e); |
немного больше памяти, чем |
|
} |
HashSet (для хранения |
|
порядка добавления) |
||
|
//AAAAAAAAAAAAAAAAAAA1
//BBBBBBBBBBBBBBBBBBB2
online.mirea.ru
Центр дистанционного обучения
Collections Framework
В TreeSet можно добавлять только сравнимые элементы (объекты класса, реализующего интерфейс Comparable):
Set<String> s1 = new TreeSet<>(); s1.add("A");
s1.add(“C");
s1.add("B");
Порядок в TreeSet – по возрастанию элементов: A, B, C (автоматически сортирует элементы при добавлении).
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Словарь (ассоциативная таблица):
Ключ (K) |
Значение (V) |
|
|
book |
книга |
|
|
table |
стол |
|
|
zoo |
зоопарк |
|
|
Англо-русский словарь
Можно считать множеством (Set) пар (ключ, значение) – ключ не может дублироваться.
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Словарь (ассоциативная таблица):
public interface Map<K, V> { int size();
boolean isEmpty();
V get(Object key); // поиск значения по ключу
V put(K key, V value);
V remove(Object key);
boolean containsKey(Object key); void clear();
}
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Для этого интерфейса есть реализации:
•HashMap – аналог HashSet, хранит пары (ключ, значение) в случайном порядке
•LinkedHashMap – аналог LinkedHashSet, хранит пары (ключ,
значение) в порядке добавления
•TreeMap – аналог TreeSet, хранит пары (ключ, значение) в порядке возрастания ключа
Основная функция – быстрый поиск значения по ключу, быстрее чем полный перебор всех строк таблицы.
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Map<String, String> engRus = new HashMap<>();
engRus.put(“book”, “книга”); engRus.put(“table”, “стол”);
String tableRus = engRus.get(“table”); // “стол” engRus.remove(“book”);
Метод put:
•если такого ключа еще нет в таблице, добавляет пару (ключ, значение) в таблицу, возвращает null
•если такой ключ уже есть, заменяет значение на новое, возвращает старое значение
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Как работает HashMap/LinkedHashMap
|
Ключ |
Значение |
|
|
|
|
aardvark |
трубкозуб |
|
|
|
A |
air |
воздух |
|
|
|
|
... |
... |
|
|
|
|
base |
база |
|
|
|
B |
book |
книга |
|
|
|
|
... |
... |
|
|
|
... |
... |
... |
|
|
|
|
zone |
зона |
|
|
|
Z |
zoo |
зоопарк |
|
|
|
|
... |
... |
|
|
|
Если ищем слово “zone”, то не надо перебирать все слова с начала словаря, достаточно только слова на букву Z.
Таким образом мы сокращаем пространство поиска в 26 раз.
online.mirea.ru
Центр дистанционного обучения
Collections Framework
Ключ |
Значение |
|
|
AA |
|
|
|
AB |
|
|
|
... |
|
|
|
AZ |
|
|
|
BA |
|
|
|
BB |
|
|
|
... |
|
|
|
BZ |
|
|
|
... |
|
|
|
ZA |
|
|
|
ZB |
|
|
|
... |
|
|
|
ZZ |
|
|
|
Если мы используем первые две буквы слова для ограничения поиска, то мы уменьшим пространство поиска в 26*26=676 раз.
Основная идея: разбить все множество ключей на подмножества (“buckets”) по некоторому критерию, и искать ключ только в том bucket, в каком он должен находиться.
online.mirea.ru