- ベストアンサー
多次元連想配列
phpで $juices["apple"]["green"] = "good"; このように多次元連想配列を簡単に生成できますが、javaでは、どのように行えばいいのでしょうか? いろいろな方法があると思われるのですが、javaでこのような多次元連想配列をスマートに実現する方法をご教授いただきたく質問させていただきました。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
すでに、いろいろ回答が付いていますが、 http://www.atmarkit.co.jp/fjava/javatips/081java010.html ここの解説が役に立ちそうです。 java.util.HashMapを利用して HashMapのvalueにさらにHashMapを入れる HashMapのkeyにArrayListを入れる の2つの方法が紹介されています。
その他の回答 (3)
- sanks99_1978
- ベストアンサー率60% (6/10)
補足です。 No.2のプログラムはあまりテストしてないので バグがあると思います。 また、No.2のプログラムをもし使用して 何か問題が発生しても保障はしかねますので よろしくお願いいたします。
- sanks99_1978
- ベストアンサー率60% (6/10)
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
お礼
やり方をサンプルでご紹介までしていただき、ありがとうございました。 今後の参考にさせていただきたく思います。
- sha-girl
- ベストアンサー率52% (430/816)
TreeMapかHashMap及びVector クラスを駆使して そういうクラスを作るしかないのでは? この場合だと2つのStringを格納するクラスを作り それをMapに格納して、検索できるようにするといった感じでしょうか。
お礼
ご回答ありがとうございました。
お礼
ありがとうございました。 ここのサイトに書いてあることを参考に、求めていた機能を実装することができました。