Отображения Map
1. Что такое отображение?
Отображение (или карта) представляет собой объект, сохраняющий связи между ключами и значениями в виде пар "ключ-значение". По заданному ключу можно найти его значение.
Ключи и значения являются объектами. Ключи должны быть уникальными, а значения могут быть дублированными.
В одних отображениях допускаются null ключи и null значения, а в других - они не допускаются.
Уникальность ключей определяет реализация метода equals().
Для корректной работы с картами необходимо переопределить методы equals() и hashCode(). Допускается добавление объектов без переопределения этих методов, но найти эти объекты в Map вы не сможете.
2. Интерфейс Map
Интерфейс Мар отображает уникальные ключи на значения.
Ключ это объект, который вы используете для последующего извлечения данных. Задавая ключ и значение, вы можете помещать значения в объект Мар. После того как это значение сохранено, вы можете получить его по ключу.
Мар обобщенный интерфейс:
interface Мар<К, V>
Здесь К указывает тип ключей, а V тип хранимых значений.
Методы интерфейса Map:
- void clear() - удаляет все пары "ключ-значение" из вызывающей карты.
- boolean containsKey(Object k) - возвращает true, если вызывающая карта содержит ключ k. В противном случае возвращает false.
- boolean containsValue(Object v) - возвращает true, если вызывающая карта содержит значение v. В противном случае возвращает false.
- Set<Map. Entry<K, V> entrySet() - возвращает Set, содержащий все значения карты. Набор содержит объекты типа Мар.Entry. То есть этот метод представляет карту в виде набора.
- V get(Object K) - возвращает значение, ассоциированное с ключом k. Возвращает null, если ключ не найден.
- boolean isEmpty() - возвращает true, если вызывающая карта пуста. В противном случае возвращает false.
- Set<K> keySet() - возвращает Set, который содержит ключи вызывающей карты. Этот метод представляет ключи вызывающей карты в виде набора.
- V put(К k, V v) - помещает элемент в вызывающую карту, перезаписывая любое предшествующее значение, ассоциированное с ключом. Ключ и значение это k и v соответственно. Возвращает null, если ключ ранее не существовал. В противном случае возвращается предыдущее значение, связанное с ключом.
- void putAll(Мар<? extends К, ? extends V> m) - помещает все значения из m в карту.
- V remove(Object k) - удаляет элемент, чей ключ равен k.
- int size() - возвращает число пар "ключ-значение" в карте.
- Collection<V> values() - возвращает коллекцию, содержащую значения карты. Этот метод представляет значения, содержащихся в карте, в виде коллекции.
3. Интерфейс SortedMap
Интерфейс SortedМap расширяет Мар. Он гарантирует, что элементы размещаются в возрастающем порядке значений ключей.
Методы интерфейса SortedMap:
- Comparator<? super К> comparator() - возвращает компаратор вызывающей сортированной карты. Если картой используется естественный порядок, возвращается null.
- К firstKey() - возвращает первый ключ вызывающей карты.
- К lastKey() - возвращает последний ключ вызывающей карты.
- SortedМap<K, V> headМap(К end) - Возвращает сортированную карту, содержащую те элементы вызывающей карты, ключ которых меньше end.
- SortedМap<K, V> subMap(К start, К end) - возвращает карту, содержащую элементы вызывающей карты, чей ключ больше или равен start и меньше end.
- SortedМap<K, V> tailMap (К start) - возвращает сортированную карту, содержащую те элементы вызывающей карты, ключ которых больше start.
4. Интерфейс NavigableMap
Интерфейс NavigableMap был добавлен в Java 6. Она расширяет SortedМap и определяет поведение карты, поддерживающей извлечение элементов на основе ближайшего соответствия заданному ключу или ключам.
Методы интерфейса NavigableMap:
Методы позволяют получить соответственно меньший, меньше или равный, больший, больше или равную пару “ключ-значение” по отношению к заданному:
Map.Entry<K,V> lowerEntry(K key)
Map.Entry<K,V> floorEntry(K key)
Map.Entry<K,V> higherEntry(K key)
Map.Entry<K,V> ceilingEntry(K key)
Методы позволяют получить соответственно меньший, меньше или равный, больший, больше или равный ключ по отношению к заданному.
K lowerKey(K key)
K floorKey(K key)
K higherKey(K key)
K ceilingKey(K key)
Методы pollFirstEntry и pollLastEntry возвращают соответственно первый и последний элементы карты, удаляя их из коллекции. Методы firstEntry и lastEntry также возвращают соответствующие элементы, но без удаления:
Map.Entry<K,V> pollFirstEntry()
Map.Entry<K,V> pollLastEntry()
Map.Entry<K,V> firstEntry()
Map.Entry<K,V> lastEntry()
Возвращает карту, отсортированную в обратном порядке:
NavigableMap<K,V> descendingMap()
Методы, позволяющие получить набор ключей, отсортированных в прямом и обратном порядке соответственно:
NavigableSet<K> navigableKeySet()
NavigableSet<K> descendingKeySet()
Методы, позволяющие извлечь из карты подмножество. Как и в случае NavigableSet, указываем в параметрах начальный и конечный элементы массива ключей, а также необходимость включения в выходной набор граничных элементов. Опять же, если не указывать флаги, то будет использован интервал ключевых значений со включённым начальным элементом, но с исключённым конечным элементом:
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
NavigableMap<K,V> headMap(K toKey, boolean inclusive)
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)
SortedMap<K,V> subMap(K fromKey, K toKey)
SortedMap<K,V> headMap(K toKey)
SortedMap<K,V> tailMap(K fromKey)
5. Интерфейс Мар.Entry
Интерфейс Мар.Entry позволяет работать с элементом карты. Метод entrySet(), объявленный в интерфейсе Мар, возвращает Set, содержащий элементы карты. Каждый из элементов этого набора представляет собой объект типа Мар.Entry.
6. Класс HashMap
Класс HashMap реализует интерфейс Мар. Он использует хеш-таблицу для хранения карты. Это позволяет обеспечить константное время выполнения методов get() и put() даже при больших наборах.
Ключи и значения могут быть любых типов, в том числе и null.
HashMap обобщенный класс со следующим объявлением:
class HashMap<K, V>
Пример 1. Использование класса HashMap
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapDemo {
public static void main(String[] args) {
Map<String, Double> hashMap = new HashMap<>();
hashMap.put("Иванов", 3434.34);
hashMap.put("Петров", 123.22);
hashMap.put("Сидоров", 1378.00);
Set<String> keys = hashMap.keySet();
for (String key : keys) {
System.out.print(key + ": ");
System.out.println(hashMap.get(key));
}
}
}
7. Класс TreeMap
TreeMap – хранит элементы в порядке сортировки. TreeMap сортирует элементы по возрастанию от первого к последнему. Порядок сортировки может задаваться реализацией интерфейсов Comparator и Comparable. Реализация Comparator передается в конструктор TreeMap, Comparable используется при добавлении элемента в карту.
Конструкторы класса TreeMap:
TreeMap()
TreeMap(Comparator<? super К> сотр)
TreeMap(Map<? extends К, ? extends V> т)
TreeMap(SortedМap<K, ? extends V> sm)
Пример 2. Использование класса TreeMap
import java.util.SortedMap;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
SortedMap<String, Double> treeMap = new TreeMap<>();
treeMap.put("Иванов", 3434.34);
treeMap.put("Петров", 123.22);
treeMap.put("Сидоров", 1378.00);
treeMap.forEach((k, v) -> System.out.println(k + ": " + v));
}
}
8. Класс LinkedHashMap
Класс LinkedHashMap расширяет HashMap. Он создает связный список элементов в карте, расположенных в том порядке, в котором они вставлялись. Это позволяет организовать итерацию по карте в порядке вставки.
8. Изменяемые объекты в качестве ключа
import java.util.HashMap;
import java.util.Map;
public class ProductKeyDemo {
public static void main(String[] args) {
Map<Product, String> map = new HashMap<>();
Product doll = new Product("Кукла", 534, "Украина");
Product box = new Product("Кубик", 34, "Украина");
Product car = new Product("Машинка", 200, "Украина");
map.put(doll, "Антошка");
map.put(box, "Антошка");
map.put(car, "Детский мир");
System.out.println(map.get(doll));
doll.setCost(434);
System.out.println(map.get(doll));
}
}
Please log in or register to have a possibility to add comment.