Jelenlegi hely

21.1.4 Map interfész

A Map olyan tároló, ami kulcs-érték párokat tartalmaz. A Map nem tud tárolni duplikált kulcsokat, egy kulcshoz csak egy érték rendelhető. A Map interfész:

public interface Map {
    V put(K key, V value);
    V get(Object key);
    V remove(Object key);
    boolean containsKey(Object key);
    boolean containsValue(Object value);
    int size();
    boolean isEmpty();
    void putAll(Map<? extends K,? extends V> t);
    void clear();
    public Set<K> keySet();
    public Collection<V> values();
    public Set<Map.Entry<K,V>> entrySet();
    public interface Entry {
        K getKey();
        V getValue();
        V setValue(V value);
    }
}

A Java platform három különböző Map implementációt tartalmaz: HashMap, TreeMap, LinkedHashMap.

A Map interfész főbb metódusai

A metódusok (put, get, containsKey, containsValue, size, és isEmpty) hasonlóképpen működnek, mint a Collection-nál. A következő program kilistázza a szövegben szereplő szavakat és azok gyakoriságát.

import java.util.*;
public class Freq {
    public static void main(String args[]) {
        Map<String, Integer>     m =
            new HashMap<String, Integer>();
        // Initialize frequency table from command line
        for (String a : args) {
            Integer freq = m.get(a);
            m.put(a, (freq == null ? 1 : freq + 1));
        }
        System.out.println(m.size() + " distinct words:");
        System.out.println(m);
    }
}

A program a következőképpen futtatható:

java Freq if it is to be it is up to me to delegate

A program kimenete:

8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}

Ha betűrendi sorrendbe akarjuk rendezni, akkor a HashMap-et TreeMap-re kell cserélni, és a következőket írja ki a képernyőre:

8 distinct words:
{be=1, delegate=1, if=1, is=2, it=2, me=1, to=3, up=1}

Ha a felbukkanás sorrendjére vagyunk kíváncsiak, akkor ez a LinkedHashMap-el tegyük, és a kimenet a következő lesz:

8 distinct words:
{if=1, it=2, is=2, to=3, be=1, up=1, me=1, delegate=1}

Két Map objektum könnyedén összehasonlítható. Akkor egyenlőek, ha a kulcs-érték párjaik megegyeznek. (A sorrend nem számít.))

A Map konstruktora egy új Map objektumot hoz létre egy már meglévő Map objektum tartalmával.

Map<K, V> copy = new HashMap<K, V>(m);

A Map interfész tömeges műveletei

A clear metódus törli a Map teljes tartalmát. A putAll metódussal átmásolható egy másik objektum tartalma. A következő példában a paraméterként kapott két Map unióját állítjuk elő:

static <K, V> Map<K, V> new AttributeMap(
        Map<K, V>defaults, Map<K, V> overrides) {
    Map<K, V> result = new HashMap<K, V>(defaults);
    result.putAll(overrides);
    return result;
}

Collection nézetek

A Map tartalmát háromféle szempont alapján nézhetjük vissza:

  • keySet: kulcsok halmaza (Set)
  • values: értékek gyűjteménye (Collection)
  • entrySet: kulcs-érték párok halmaza (Set)

A következő példa a kulcsok halmazának kiíratása:

for (KeyType key : m.keySet())
    System.out.println(key);

Ugyanez iterátorral:

for (Iterator<Type> i=m.keySet().iterator(); i.hasNext(); )
    if (i.next().isBogus())
        i.remove();

Kulcs-érték párok kiírása:

for (Map.Entry<KeyType, ValType> e : m.entrySet())
    System.out.println(e.getKey() + ": " + e.getValue());