倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Java SE 6 のコレクション・フレームワークのメソッド (6) : Map, SortedMap, NavigableMap

前回までに引き続き、今回からは Map インターフェースとそのサブインターフェースを(一覧)。

メソッドは独断と偏見で幾つかにカテゴリー分けしてます:

  • エントリーなどの取得:get() や keySet() など
  • エントリーの追加:put() など
  • エントリーの削除:remove() など

その他注意点

  • 拡張対象のインターフェースに定義されているメソッドには @Override アノテーションを付与してます。 ただし、インターフェースのメソッドに @Override を付与すると実際にはコンパイルエラーになります。

Map インターフェース

package java.util;
public interface Map<K,V>{
    int size();
    boolean isEmpty();
    boolean containsKey(Object key);
    boolean containsValue(Object value);

    // ********** エントリーなどの取得 **********
    V get(Object key);
    Collection<V> values();
    Set<K> keySet();
    Set<Map.Entry<K,V>> entrySet();

    // ********** エントリーの追加 **********
    V put(K key, V value);
    void putAll(Map<? extends K, ? extends V> m);

    // ********** エントリーの削除 **********
    V remove(Object key);
    void clear();
}

全てのキーを返すメソッド keySet()、全てのエントリーを返すメソッド entrySet() の返り値は Set なのに対して、全ての値を返すメソッド values() の返り値は Collection であることに注意。 これは、キーは(よってエントリーも)重複を許さない一方、値は重複してもよいためです。

例えば、

{a=c, b=c}

は許されますが

{a=c, a=d}

は許されません。

ちなみに、

{a=c, b=c}

に対して

keySet() : [a, b]
values() : [c, c]

となります。 values() の返り値の Collection では、要素が重複するのに注意。

SortedMap インターフェース


SortedMap はエントリーをキーの順に並べた Map です。 追加されたメソッドは Set に対して SortedSet に追加されたメソッド()と同様のものです(キーに対する同様の操作)。

SortedSet 同様、Java SE 6 以降では後に載せてある NavigableMap を使用しましょう。

package java.util;
public interface SortedMap<K,V> extends Map<K,V>{
    @Override int size();
    @Override boolean isEmpty();
    @Override boolean containsKey(Object key);
    @Override boolean containsValue(Object value);
    Comparator<? super K> comparator();

    // ********** エントリーなどの取得 **********
    @Override V get(Object key);
    @Override Collection<V> values();

    K firstKey();
    K lastKey();
    @Override Set<K> keySet();

    @Override Set<Map.Entry<K,V>> entrySet();

    SortedMap<K,V> headMap(K toKey);
    SortedMap<K,V> subMap(K fromKey, K toKey);
    SortedMap<K,V> tailMap(K fromKey);

    // ********** エントリーの追加 **********
    @Override V put(K key, V value);
    @Override void putAll(Map<? extends K,? extends V> m);

    // ********** エントリーの削除 **********
    @Override V remove(Object key);
    @Override void clear();
}

NavigableMap インターフェース


NavigableMap もエントリーをキーの順に並べた Map です。 SortedMap よりも順序に関連した取得メソッドが豊富に定義されています(逆に分かりにくい?)。 Java SE 6 以降では NavigableMap を使用しましょう。

package java.util;
public interface NavigableMap<K,V> extends SortedMap<K,V>{
    @Override int size();
    @Override boolean isEmpty();
    @Override boolean containsKey(Object key);
    @Override boolean containsValue(Object value);
    @Override Comparator<? super K> comparator();

    // ********** エントリーなどの取得 **********
    @Override V get(Object key);
    @Override Collection<V> values();

    @Override K firstKey();
    K lowerKey(K key);
    K floorKey(K key);
    K ceilingKey(K key);
    K higherKey(K key);
    @Override K lastKey();
    @Override Set<K> keySet();
    NavigableSet<K> navigableKeySet();
    NavigableSet<K> descendingKeySet();

    Map.Entry<K,V> firstEntry();
    Map.Entry<K,V> lowerEntry(K key);
    Map.Entry<K,V> floorEntry(K key);
    Map.Entry<K,V> ceilingEntry(K key);
    Map.Entry<K,V> higherEntry(K key);
    Map.Entry<K,V> lastEntry();
    Map.Entry<K,V> pollFirstEntry();
    Map.Entry<K,V> pollLastEntry();
    @Override Set<Map.Entry<K,V>> entrySet();

    NavigableMap<K,V> descendingMap();
    @Override SortedMap<K,V> headMap(K toKey);
    @Override SortedMap<K,V> subMap(K fromKey, K toKey);
    @Override SortedMap<K,V> tailMap(K fromKey);
    NavigableMap<K,V> headMap(K toKey, boolean inclusive);
    NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive);
    NavigableMap<K,V> tailMap(K fromKey, boolean inclusive);

    // ********** エントリーの追加 **********
    @Override V put(K key, V value);
    @Override void putAll(Map<? extends K,? extends V> m);

    // ********** エントリーの削除 **********
    @Override V remove(Object key);
    @Override void clear();
}