2013年9月21日土曜日

JavaのMapに同じキーの要素を含めるには

JavaのMapに同じキーに対して複数の要素を含めたくなる場合があります。
しかし、Javaの標準ライブラリに含まれるMapの実装にはHashMapやTreeMapがありますが、これらは重複したキーの要素を単純に登録することはできません。

対策1.HashMapなどの要素をコレクション型(ArrayListなど)にする

もっとも単純な解決策は要素をコレクション型にすることです。

iimport java.util.*;

public class Test {
  public static void main(String[] args) {
    Map<String,List<Integer>> map = new HashMap<String,List<Integer>>();
    // 登録
    List<Integer> list = new ArrayList<Integer>();
    list.add(11);
    list.add(12);
    map.put("group1", list);

    // 参照
    for ( Integer i : map.get("group1") ) {
      System.out.println(i);
    }
  }
}

対策2.guava-librariesのようなサードパーティライブラリを使用する

重複キーをうまく取り扱うことができるサードパーティ製の信頼できるライブラリが公開されています。

Guavaプロジェクトのページ
https://code.google.com/p/guava-libraries/

重複キーを扱えるMap実装(ArrayListMultiMap)
http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/ArrayListMultimap.html

下記のサンプルコードを見ると登録がとても簡潔にできるようになっているのが分かるかと思います。

import java.util.*;
import com.google.common.collect.*;

public class Test2 {
  public static void main(String[] args) {
    Multimap<String,Integer> map = ArrayListMultimap.create();
    // 登録
    map.put("group1", 11);
    map.put("group1", 12);

    // 参照
    for ( Integer i : map.get("group1") ) {
      System.out.println(i);
    }
  }
}

0 件のコメント:

コメントを投稿