• ベストアンサー

多次元連想配列

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

  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • 2次元の連想配列を検索できません。

    以下の2次元配列でstatusが2の配列(orange)だけを 返したいのですがPHPでどう組めば実現できるでしょうか? Array ( [orange] => Array ( [start_date] => 20041122 [status] => 2 ) [apple] => Array ( [start_date] => 20041123 [status] => 1 ) ) foreach()とかやってみているのですが、はまってます(T_T)

    • ベストアンサー
    • PHP
  • 2次元の連想配列を順次読み込みするには?

    PHP初心者です。 元の連想配列($ary1)   Array ( [2004] => Array ( [03] => 03 [02] => 02 ) [2003] => Array ( [12] => 12 ) ) $ary1の値だけを$ary2に抽出する。   $ary2 = array_values($ary1); すると、こんな内容になります。   Array ( [0] => Array ( [03] => 03 [02] => 02 ) [1] => Array ( [12] => 12 ) ) ここまで来ると上位階層は$ary2[0]、[1]で読めそうですが、 下位階層まで考えると$ary2[0][03]、$ary2[0][02]になっています。 これを$ary2[0][0]、$ary2[0][1]という風に順次読み込みたいのですが、 いい方法が見つかりません。 つまり2次元の下位階層も[0]~のインデックスとしたいのです。

    • ベストアンサー
    • PHP
  • 多次元連想配列の削除

    初めまして、自分でhpを持ちたく、Perlの勉強をしておりますパールマンと申します。 連想配列の連想配列で、下記のような $nihon = {      'tokyo' => {            'setagaya' => 1,            'shibuya' => 1            },      'osaka' => {            'namba' => 1,            'kitashinchi' => 1            }, 多次元連想配列を作ったとして、 この「%nihon」自体を削除したいのですが、どのようにしたら良いのでしょうか? delete %nihon や undef %nihon としても、ループ処理でキーを取り出すと物が残っており困っています。 どうもこの多次元配列自体が「リファレンス」というもで、、、 delete %nihon や undef %nihon はスッゲェ見当外れ、つぅか%nihonは別モンですよ。みたいなとこまではボンヤリわかってきたのですが…。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 2次元配列

    2次元配列は宣言して生成しますが配列名が異なる配列を例えば100個用意するにはいちいち宣言していたらすごいプログラム量になるので何かいい方法はないでしょうか?付け足しで指定した個数(例えば100個)分名前の異なる2次元配列を生成するには? java初心者なのでサンプルプログラムがあるとありがたいです。よろしくお願いします。

  • AJAXでサーバーにある連想配列を取り出す

    こんにちは。PHP学習者です。 ブラウザ上でAJAXを使って、サーバーにあるPHPで作ったデータファイルを取得する方法は知っていますが、連想配列を取得することは出来ますか? 今までは連想配列をわざわざテキストファイルに書き換えてからAJAXで取得していましたが、もし直接取得する方法があれば知りたいと思いました。 詳しい方、どうかよろしくご教授ください。お願いします。

  • 他スクリプトの連想配列を扱いたい

    a.phpにある特定の連想配列を、b.phpで扱いたいのですが どのようにすれば良いのでしょうか?? 簡略化して書きますが、a.phpに $a[japan][kantou][] = "東京"; $a[japan][kantou][] = "神奈川"; $a[japan][kantou][] = "千葉"; $a[japan][kansai][] = "大阪"; $a[japan][kansai][] = "兵庫"; $a[japan][kansai][] = "京都";    ・    ・    ・ (簡略化していますが実際はもっと複雑な連想配列です。) 上記のような連想配列があり、 b.phpで、$a[japan][kansai]の配列を扱いたいのです。 b.phpで、requireを使ってa.phpを読み込んでも a.php内の他の実行処理までされてしまうのでNG。 扱いたい連想配列をtxtなどに出力し、 b.phpでそのtxtを読み込んで扱う事も考えたのですが、わざわざ出力するのも・・・ なのでNG。 globalで、他スクリプトの特定の連想配列を読み込む事はできないですよね・・・? 何かいい方法があればご教授頂けたらと思います。

    • ベストアンサー
    • PHP
  • こういった連想配列の結合は可能でしょうか?

    お世話になっておりますm(_ _)m 今、下記のような3つの連想配列がありまして、 これらを1つの連想配列に統合出来ないか調べているのですが、 上手い方法が見つかりません。 $arrayAAA[0]['name'] = "goo"; $arrayBBB[0]['color'] = "white"; $arrayCCC[0]['media'] = "web"; ↓統合してこのようにしたい $newArray[0]['name'] //"goo" $newArray[0]['color'] //"white" $newArray[0]['media'] //"web" 上記の例では0番目の配列のみですが、 実際は40番までインデックス値があります。 もし、これを実現する方法をご存知の方がおりましたら、 ご教授頂けませんでしょうか? よろしくお願い致しますm(_ _)m

    • ベストアンサー
    • PHP
  • 多次元配列は配列の配列である

    Java勉強中なんですが、参考書を読んでいて「多次元配列は、実際には配列の配列である。つまり、2次元配列(array[][])がある場合、実際にはこれをarray[0]、array[1]、array[2]、といった1次元配列に配列として扱う事ができる。」と書いてあり、例題で、 double array[][] = new double[5][]; array[0] = new double[500]; array[0] = new double[400]; array[0] = new double[300]; array[0] = new double[200]; array[0] = new double[100]; と書いてありました。これについてのこれ以上の説明はなく、理解できなくて困っています。ご教授宜しくお願いいたします。

    • ベストアンサー
    • Java
  • 多次元配列を2次元の連想配列で表したい

    PHP初心者です。 $category = array( array( 'ライフ' ), array( 'デジタルライフ', array( '携帯・PHS' ), array( 'ワンセグ放送' ) ), array( '趣味', array( 'AV機器', array( 'オーディオ' ), ), ), ); このような多次元配列を $new_category = array( array( 'id'=> '1', 'parent_id' => '-', 'name' => 'ライフ', ), array( 'id'=> '2', 'parent_id' =>'-', 'name' => 'デジタルライフ', ), array( 'id'=> '3', 'parent_id' => '2', 'name' => '携帯・PHS', ), array( 'id'=> 4, 'parent_id' => '2', 'name' => 'ワンセグ放送', ), array( 'id'=> 5, 'parent_id' => '-', 'name' => '趣味', ), array( 'id'=> '6', 'parent_id' => '5', 'name' => 'AV機器', ), ); このような二次元配列に変換したいです。 parent_idを入れておく配列を作って、階層が深くなったら前の要素のIDを配列に入れ、浅くなったら配列の末尾の要素を消去する…みたいなことを考えてあれこれやってみたのですが、なかなかうまくいきません。 何か良い方法がありましたら、教えていただけるとありたがいです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • フォームを通さずに2次元配列の値の受け渡しについて教えてください

    お世話になります。 以前にも質問させて頂きましたが、うまくいかずもう1度質問させてください。 phpで2次元配列の値の受け渡しについて教えてください。 A.phpファイルからB.phpファイルに2次元配列の値をフォームを通さずにPOSTで渡したいと考えています。 処理上、2次元配列のままB.phpファイルに値を渡したいと考えています。 そもそもPOSTで2次元配列を送ることはできるのでしょうか? その他の方法で2次元配列のままB.phpファイルに渡すことが出来るのであれば、その方法も教えて頂きたいのですが。 たとえば [A.php] $DATA = array( array('name'=>"tanaka", 'age'=>"20"), array('name'=>"sasaki", 'age'=>"30"), ); をB.phpファイルに送るにはどうすれば良いのでしょうか? ※2次元配列のサイズは可変です。 どなたか教えて頂けないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう