プロが教えるわが家の防犯対策術!

phpで

$juices["apple"]["green"] = "good";

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

A 回答 (4件)

すでに、いろいろ回答が付いていますが、


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

参考URL:http://www.atmarkit.co.jp/fjava/javatips/081java …
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/18 21:50

補足です。


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

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/18 21:52

TreeMapかHashMap及びVector クラスを駆使して


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

参考URL:http://msugai.fc2web.com/java/collection/HashMap …
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/18 21:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!