Лабораторно упражнение 11

Колекции - 2 част

Map (карта) е структура от данни, която съхранява двойки ключ - стойност (key - value).

Основни характеристики на колекции от тип Map:

  • съхранява данни като асоциации (двойки ключ-стойност)

  • всеки ключ е уникален за дадената колекция

  • стойностите от своя страна могат да се повтарят

  • няма индекси

  • предоставят бързо търсене по ключ.

Като пример за подобен тип структура могат да бъдат разгледани речник (дума - определение), телефонен указател (име - номер) и други подобни.

За разлика от List и Set, Map не наследява интерфейса Collection, което означава, че няма същите методи като тези тип колекции. Някои от основните методи за работа с карти са:

//добавяне на елемент
V put(K key, V value)
//достъп до елемент, връща null при липса на предавания като параметър ключ
V get(Object key)
//проверка дали колекцията съдържа посочения ключ
boolean containsKey(Object key)
//проверка дали колекцията съдържа посочената стойност
boolean containsValue(Object value)
//проверка за празна колекция
boolean isEmpty()
//връща броя двойки ключ-стойност
int size()
//връща колекция от уникални ключове
Set<K> keySet()
//връща колекция от всички стойности
Collection<V> values()
//връща сет с всяка двойка ключ-стойност 
Set<Map.Entry<K,V>> entrySet()

Основни имплементации на Map

HashMap:

  • най-често използваната имплементация

  • високо бързодействие

  • не гарантира подредба при добавянето на елементите

  • подходяща в случаи на чести операции put/get, при реализация на кеш и при работа с големи обеми данни.

LinkedHashMap:

  • запазва реда на добавяне на елементи (по подобие на списъците)

  • по-бавен в сравнение с HashMap

  • подходящ за случаи, в които се налага обхождане/итериране в точно определен ред.

TreeMap:

  • поддържа сортирани ключове - при добавяне двойката автоматично се добавя на място според реда на ключа

  • не позволява наличие на нулеви ключове

  • реализация на червено-черно дърво.

Обхождане и сортиране на Map

Както е посочено по-горе, методът entrySet() връща множество двойки ключ-стойност. Следният пример показва различните начини за обхождане на карта:

import java.util.HashMap;
import java.util.Map;

public class Faculty {

    // pair specialty - number of students
    private Map<String, Integer> specialities = new HashMap<>();

    public void displayPairs() {
        for (Map.Entry<String, Integer> pair : specialities.entrySet()) {
            System.out.println(pair.getKey() + " " + pair.getValue());
        }
    }

    public void displayKeys() {
        for (String key : specialities.keySet()) {
            System.out.println(key);
        }
    }

    public void displayValues() {
        for (Integer value : specialities.values()) {
            System.out.println(value);
        }
    }
}

Тъй като Map не е линейна структура, сортирането може да бъде направено или по ключ, или по стойност:

// за целта обекта, използван за ключ, трябва да имплементира Comparable
    public Map<String, Integer> sortByKey() {
        return new TreeMap<>(specialities);
    }

    public void sortByValue() {
        List<Map.Entry<String, Integer>> specialtyList = new ArrayList<>(specialities.entrySet());
        specialtyList.sort(Map.Entry.comparingByValue()); // при сложен обект, може да се дефинира Comparator
    }

Table of contents