• ベストアンサー

多次元連想配列

phpで $juices["apple"]["green"] = "good"; このように多次元連想配列を簡単に生成できますが、javaでは、どのように行えばいいのでしょうか? いろいろな方法があると思われるのですが、javaでこのような多次元連想配列をスマートに実現する方法をご教授いただきたく質問させていただきました。

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.4

すでに、いろいろ回答が付いていますが、 http://www.atmarkit.co.jp/fjava/javatips/081java010.html ここの解説が役に立ちそうです。 java.util.HashMapを利用して HashMapのvalueにさらにHashMapを入れる HashMapのkeyにArrayListを入れる の2つの方法が紹介されています。

参考URL:
http://www.atmarkit.co.jp/fjava/javatips/081java010.html
monta19
質問者

お礼

ありがとうございました。 ここのサイトに書いてあることを参考に、求めていた機能を実装することができました。

その他の回答 (3)

回答No.3

補足です。 No.2のプログラムはあまりテストしてないので バグがあると思います。 また、No.2のプログラムをもし使用して 何か問題が発生しても保障はしかねますので よろしくお願いいたします。

回答No.2

javaプログラムを書いていて そういうものを作るときは毎回書いてましたし あんまり簡単に連想配列とかつくると プログラムがわかりにくくなるかもしれないなあ とも思うのですが まあ、きょうみがあったのでつくってみました。 私もそういうクラスをつくるのが一番いいかと思います。 プログラムがぐちゃぐちゃなので 役に立たないかも・・。 あとタブを全角SPにしてるのでそのままだとコンパイルできません。 package jp; import java.util.HashMap; public class PluralDimensionMap {   HashMap map = new HashMap();   int dimensionLength =0;      /**    * コンストラクタ.    */   public PluralDimensionMap(String[] keyArray, Object value) {     if(keyArray==null || keyArray.length==0) {       return;     }     map = new HashMap();     dimensionLength = keyArray.length;     map.put(keyArray[keyArray.length-1], value);     for (int i=(keyArray.length-2); i>=0; i--) {       map = putMap(keyArray[i], map);         }   }   /**    * 値の取得.    */   public Object get(String[] keyArray) {     if(keyArray==null || keyArray.length==0) {       return null;     }     HashMap map_=null;     for (int i=0; i<(keyArray.length-1); i++) {       map_ = (HashMap)map.get(keyArray[i]);       }     return map_.get(keyArray[keyArray.length-1]);   }   /**    * 設定.    */   public void put(String[] keyArray, Object value) {     if(keyArray==null || keyArray.length!=dimensionLength) {       throw new RuntimeException("キー配列の長さは初期時と同じにしてください。");             }     Object[] array= (Object[])getAccessMap(map, keyArray, 0);     HashMap map_= (HashMap)array[0];     int newMapIndex = ((Integer)array[1]).intValue();     if(newMapIndex<keyArray.length-1) {       HashMap newMap = new HashMap();       newMap.put(keyArray[keyArray.length-1], value);       for (int i=(keyArray.length-2-newMapIndex); i>=1; i--) {         newMap = putMap(keyArray[i], map_);           }       map_.put(keyArray[newMapIndex], newMap);     } else {       map_.put(keyArray[keyArray.length-1], value);     }   }   private Object[] getAccessMap(HashMap map_, String[] keyArray, int i) {     if(i==keyArray.length-1) {       return new Object[]{map_, new Integer(i)};     }     HashMap mapRe = (HashMap)map_.get(keyArray[i]);     if(mapRe==null) {       return new Object[]{map_, new Integer(i)};     } else {       return getAccessMap(mapRe, keyArray, i+1);     }   }   private HashMap putMap(String key, HashMap map_) {     HashMap mapRe = new HashMap();     mapRe.put(key, map_);       return mapRe;   } } 使い方サンプル ---------------------------------------------------------     PluralDimensionMap map = new PluralDimensionMap(new String[]{"111", "222"}, "111222");     map.put(new String[]{"111", "333"}, "111333");     map.put(new String[]{"222", "444"}, "222444");     String value = (String)map.get(new String[]{"111", "222"});     System.out.println(value);     String value2 = (String)map.get(new String[]{"111", "333"});     System.out.println(value2);     String value3 = (String)map.get(new String[]{"222", "444"});     System.out.println(value3);     map.put(new String[]{"111", "333"}, "xxxxxxx");     String value4 = (String)map.get(new String[]{"111", "333"});     System.out.println(value4); サンプル出力結果 --------------------------------------------------------- 111222 111333 222444 xxxxxxx

monta19
質問者

お礼

やり方をサンプルでご紹介までしていただき、ありがとうございました。 今後の参考にさせていただきたく思います。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

TreeMapかHashMap及びVector クラスを駆使して そういうクラスを作るしかないのでは? この場合だと2つのStringを格納するクラスを作り それをMapに格納して、検索できるようにするといった感じでしょうか。

参考URL:
http://msugai.fc2web.com/java/collection/HashMap.html
monta19
質問者

お礼

ご回答ありがとうございました。

関連するQ&A