- ベストアンサー
多次元連想配列
- みんなの回答 (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に格納して、検索できるようにするといった感じでしょうか。
お礼
ご回答ありがとうございました。
関連する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
- AJAXでサーバーにある連想配列を取り出す
こんにちは。PHP学習者です。 ブラウザ上でAJAXを使って、サーバーにあるPHPで作ったデータファイルを取得する方法は知っていますが、連想配列を取得することは出来ますか? 今までは連想配列をわざわざテキストファイルに書き換えてからAJAXで取得していましたが、もし直接取得する方法があれば知りたいと思いました。 詳しい方、どうかよろしくご教授ください。お願いします。
- ベストアンサー
- JavaScript
- 他スクリプトの連想配列を扱いたい
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
お礼
ありがとうございました。 ここのサイトに書いてあることを参考に、求めていた機能を実装することができました。