Урок 16

Отображения Map


1. Что такое отображение?

Отображение (или карта) представляет собой объект, сохраняющий связи между ключами и значениями в виде пар "ключ-значение". По заданному ключу можно найти его значение.

Ключи и значения являются объектами. Ключи должны быть уникальными, а значения могут быть дублированными.

В одних отображениях допускаются null ключи и null значения, а в других - они не допускаются.

Уникальность ключей определяет реализация метода equals().

Для корректной работы с картами необходимо переопределить методы equals() и hashCode(). Допускается добавление объектов без переопределения этих методов, но найти эти объекты в Map вы не сможете.

Иерархия отображений

2. Интерфейс Map

Интерфейс Мар отображает уникальные ключи на значения.

Ключ это объект, который вы используете для последующего извлечения данных. Задавая ключ и значение, вы можете помещать значения в объект Мар. После тогo, как это значение сохранено, вы можете получить eгo по ключу.

Мар обобщенный интерфейс: 

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) {
        // Create a hash map.
        Map<String, Double> hm = new HashMap<>();

        // Put elements to the map
        hm.put("John Doe", 3434.34);
        hm.put("Tom Smith", 123.22);
        hm.put("Jane Baker", 1378.00);
        hm.put("Tod Hall", 99.22);
        hm.put("Ralph Smith", 99.22);

        // Get a set of the entries.
        Set<Map.Entry<String, Double>> set = hm.entrySet();

        // Display the set.
        for (Map.Entry<String, Double> me : set) {
            System.out.print(me.getKey() + ": ");
            System.out.println(me.getValue());
        }

        System.out.println();

        // Deposit 1000 into John Doe's account.
        double balance = hm.get("John Doe");
        hm.put("John Doe", balance + 1000);

        System.out.println("John Doe's new balance: "
                + hm.get("John Doe"));
    }
}

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.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        // Create a tree map.
        Map<String, Double> tm = new TreeMap<>();

        // Put elements to the map.
        tm.put("John Doe", 3434.34);
        tm.put("Tom Smith", 123.22);
        tm.put("Jane Baker", 1378.00);
        tm.put("Tod Hall", 99.22);
        tm.put("Ralph Smith", -19.08);

        // Get a set of the keys.
        Set<String> set = tm.keySet();

        // Display the elements.
        for (String me : set) {
            System.out.print(me + ": ");
            System.out.println(tm.get(me));
        }
        System.out.println();

        // Deposit 1000 into John Doe's account.
        double balance = tm.get("John Doe");
        tm.put("John Doe", balance + 1000);

        System.out.println("John Doe's new balance: "
              +  tm.get("John Doe"));
        for (Double value : tm.values()) {
            System.out.println(value);
        }
    }
}

8. Класс LinkedHashMap

Класс LinkedHashMap расширяет HashMap. Он создает связный список элементов в карте, расположенных в том порядке, в котором они вставлялись. Это позволяет организовать итерацию по карте в порядке вставки.



0 comments
Leave your comment: