Java1.3でMapを使用したプログラムでの結果不一致の原因

このQ&Aのポイント
  • Java1.3でMapを使用したプログラムで、特定の結果が期待通りにならない問題が発生しています。要素の格納や更新の手順が誤っている可能性があります。
  • 結果が一部の要素だけでなくすべての要素に反映されているため、キーの値を正しく取得できていない可能性があります。
  • 問題の原因を特定するには、プログラムの他の部分やデータの初期化、ループの処理などを確認する必要があります。デバッガを使用してステップ実行しながら変数の値を確認することをおすすめします。
回答を見る
  • ベストアンサー

Mapの扱いについて

いつもお世話になっております。 ただ今Java1.3にてMapを使用したプログラムを作成しております。 String[] hoge = {"0","0","0","0"}; String[] key = {"いいい","ううう","えええ"}; int[] point = {0,1,3}; String[] value = {"5","8","2"}; Map map = new HashMap(); map.put("あああ",hoge); map.put("いいい",hoge); map.put("ううう",hoge); map.put("えええ",hoge); map.put("おおお",hoge); for (int i=0; i < key.length; i++) { String[] wk_hoge = (String)map.get(key[i]); wk_hoge[point[i]] = value[i]; map.put(key[i],wk_hoge); } 上記のように記述し、結果としては あああ="0","0","0","0" いいい="5","0","0","0" ううう="0","8","0","0" えええ="0","0","0","2" おおお="0","0","0","0" としたいのですが、実際の結果が あああ="5","8","0","2" いいい="5","8","0","2" ううう="5","8","0","2" えええ="5","8","0","2" おおお="5","8","0","2" となってしまいます。 なぜそのようになってしまうのか原因がわかりません。 どなたかアドバイスをお願い致します。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

map.put("あああ",hoge); map.put("いいい",hoge); map.put("ううう",hoge); map.put("えええ",hoge); map.put("おおお",hoge); どのキーも、同じオブジェクトを参照しているからです。 "あああ"も"いいい"も、その他どのキーも全て同じ String[] 型の'hoge'というオブジェクトの参照を値として持っています。 putする際に全部改めてnewすればこの問題は起こらなくなります。 hoge = new String[4]; hoge[0]=0; hoge[1]=1; hoge[2]=0; hoge[3]=0; map.put("あああ",hoge); hoge = new String[4]; hoge[0]=0; hoge[1]=1; hoge[2]=0; hoge[3]=0; map.put("いいい",hoge);       :       :

hisajiro
質問者

お礼

迅速に回答をいただきありがとうございます。 回答の通りにnewをするように変更した所、思っていた通りの動きになりました。 本当にありがとうございました。

関連するQ&A

  • 2つのリストのマージ方法について

    2つのリストのマージ方法について 下記の要件を満たしたいと考えています。 ・リスト1・2をkeyをキーにマージしたい。  リスト1[0]:key=2, value1=b  リスト1[1]:key=3, value1=d  リスト1[2]:key=4, value1=e  ・  ・  ・  リスト2[0]:key=1, value2=A  リスト2[1]:key=2, value2=B  リスト2[2]:key=5, value2=F  リスト2[3]:key=6, value2=G  ・  ・  ・  ↓  リスト3[0]:key=1, value1=A, value=""  リスト3[1]:key=2, value1=b, value=B  リスト3[2]:key=3, value1=d, value=""  リスト3[3]:key=4, value1=e, value=""  リスト3[4]:key=5, value1="", value=F  リスト3[5]:key=6, value1="", value=G  ・  ・  ・ ・リスト1・2はkeyの昇順でソート済。各リスト内では重複しているkeyはない。 ・マージ後もkeyの昇順にしたい。 ・実際のリストはそれぞれ数万件~数十万件なので、パフォーマンスを考慮したい。 下記のように作成してみたのですが、無理やりやりました感があり、分かりづらくバグがありそうです。またループでnewもしてたりしてパフォーマンスも悪そうです。もっとスマートにパフォーマンスもよい方法がないでしょうか? int checkedCount = 0; for (int i = 0; i < list1.size(); i++) { String str1 = list1.get(i).get("key"); for (int j = checkedCount; j < list2.size(); j++) { Map<String, String> map3 = new HashMap<String, String>(); String str2 = list2.get(j).get("key"); if (str1.compareTo(str2) < 0) { if (i != list1.size() - 1) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", ""); list3.add(map3); break; } else { Map<String, String> map4 = new HashMap<String, String>(); map4.put("key", str2); map4.put("value1", ""); map4.put("value2", list2.get(j).get("value2")); list3.add(map4); } } else if (str1.compareTo(str2) == 0) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; break; } else { map3.put("key", str2); map3.put("value1", ""); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; } } }

    • ベストアンサー
    • Java
  • java のMAPをソートするとき

    以下のプログラムがあったとします、 Map<Integer, String> map = new HashMap<Integer, String>(); map.put( 0 , "abc" ); map.put( 4 , "efg" ); map.put( 1 , "hij" ); map.put( 3 , "klm" ); map.put( 2 , "npo" ); これで、mapのキーをソートするにはどうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • Map<T, ArrayList<T>>にput

    Map<String, ArrayList<Long>> map = new HashMap<String, ArrayList<Long>>(); と宣言された map に put()する方法を教えて下さい。言語はJavaです。 mapの値がArrayListのため、map.put("key", 10L);のように直接代入することができません。 解決策を教えて下さい。 ※質問のタイトルは字数制限のため、変なタイトルになっています。

    • ベストアンサー
    • Java
  • android CSVファイルのデータを

    初心者ですが宜しくお願いします。 やりたい処理えですが、CSVファイルのデータをHashMapにセットしたいのです。 現在は下記のように直接値をセットしています。 この値をCSVからセットするにはどうすればよいでしょうか? HashMap<String, String> map = new HashMap<String, String>(); // キーと値のペアを格納 map.put( "Key1", "あ1001" ); map.put( "key2", "い1002" ); map.put( "Key3", "う1003" ); map.put( "key4", "え1004" ); map.put( "key5", "err" ); ------------------------------------ value.csv "key2", "い1002" "Key3", "う1003" "key4", "え1004" "key5", "err" ------------------------------------ 上記csvファイルを作り、読み込むところまではわかります。 ヒント、参考サイトや参考書の情報でもかまいません。 どうぞよろしくおねがいいたします。

    • ベストアンサー
    • Java
  • MAPの配列・・・???!!!

    Mapというものを使うのが初めてなのですが、 よくわからなくなってしまいました。 他のプログラムから、 「MAPの配列で返ってくる」 のですが、このMAPの配列をintひとつ、ストリング2つから 作ろうとしているのですが、できずに困っています。 map[0]=("abc","ABC") map[1]=("def","DEF") map[2]=("ghi","GHI") ・ ・ みたいなイメージなのですが、エラーになります・・・ Map[] hairetu = new HashMap(); これでコンパイルできません。 HelloWorldMap.java:17: 互換性のない型 出現: java.util.HashMap 要求: java.util.Map[] Map[] hairetu = new HashMap(); Map[] hairetu; という宣言だけならできます。 受け渡し先でMapの配列を要求しているのでこのような形が必要なのですが・・・ ちなみにソースを見ると hairetu[i].get(キー) みたいなとり方をしています。

    • ベストアンサー
    • Java
  • javaの連想配列について教えてください

    お世話になります。 javaの連想配列について教えてください。 やりたいことは下記のようなデータを作成したいです。 ================================================ {   "shcool" : {          "class" : "A",          "yamada" : {                "class" : "AA",                "height" : 165,                "weight" : 60         },          "saitou" : {                "class" : "AB",                "height" : 170,                "weight" : 65         }   } } ================================================ 下記HPを参考してHashMap+HashMapで作成したのですがうまくいきません。 http://www.atmarkit.co.jp/fjava/javatips/081java010.html Map<String, Object> map = new HashMap<String, Object>(); map.put("school", new HashMap<String, Object>()); ((Map) map.get("school")).put("class", "A"); ((Map) map.get("school")).put("yamada", new HashMap<String, Object>()); ((Map) map.get("school")).get("yamada").put("class", "AB"); ・・・ としても下記エラーとなってしまいます。 ----------------------------------------------------- エラー: シンボルを見つけられません ((Map) map.get("school")).get("yamada").put("class", "AB");                            ^ シンボル: メソッド put(String,String) ----------------------------------------------------- 途中のschoolのvalueにHashMapを入れるところまではうまくいっているようですが、 yamadaのvalueにHashMapを入れて.put()の仕方がわかりません。。。 上記データをHashMap+HashMapで作成するにはどうしたらよいでしょうか? ぜひご教示いただけると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • LISTとMAPについて

    以下のように記述されたコードで 他クラスからこのクラスのインスタンスを生成して tempMapのkeyとValueを抜き出したいのですが なにか良い方法ありますでしょうか? 宜しくお願いします。 public class TestListMap { protected List list = null; private Map tempMap = null; public TestListMap(){ list = new ArrayList(); for(int i=0; i < 10; i++ ){ tempMap = new HashMap(); tempMap.put("NO", "00" + i); tempMap.put("TYPE", "AAA" + i); if (i % 2 == 0 | i % 3 == 0) { tempMap.put("FLG", "1"); } else { tempMap.put("FLG", "0"); } list.add(tempMap); } } public List getListMap(){ return list; } }

    • ベストアンサー
    • Java
  • hashCodeの使用について

    いつもお世話になっています。 hashCodeについて聞きたいのですが、 hashCodeは、暗号化にも利用されるらしいのですが、 使用理由がよくわかりません。 その場合、 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000045.htmlのURLによると、 HashMapクラスはキーからハッシュコードを取得し、ハッシュコードごとにグループ分けして値を格納する。 値を取得する時には、取り出すために渡されたキーからハッシュコードを取得し、そのハッシュコードを元にまず ハッシュコードごとのグループを取得し、 その後グループ内でキーを元に全検索を行う。 この方法によりHashMapクラスは値の検索がArrayListクラスよりも 早い。 また、ハッシュコードから元のデータは復元できないため、暗号化にも 使用される。 、 どういうことなのでしょうか? 上記の文を解釈して、ソースを作成しようとは思ったのですが、 よくわかりません。 作成してみたソースは、 HashMap hashMap = new HashMap(); //ハッシュコードで格納するmapデータ Map map = new HashMap(); map.put(0,"Tell"); map.put(1, "AAA"); map.put(2,"TTT"); //ハッシュコード String keyword = "keyword"; int key = keyword.hashCode(); //ハッシュコードでキーを設定 hashMap.put(key,map); //格納するMap Map maP = new HashMap(); for(int h=0;h<hashMap.size();h++) { //キーワードをハッシュコードに変換 int stK =keyword.hashCode(); //ハッシュコードで格納したMapデータの取り出し maP = (Map) hashMap.get(stK); } //Mapデータ表示 for(int i=0;i<maP.size();i++) { System.out.println(maP.get(i)); } つまり、ハッシュコードは文字が暗号化され、元の文字がわからない = 暗号化されたに等しくなる ということだけは何とかわかるような気はするのですが。。。 聞きたいのは、ハッシュコードをmapキーにした場合、 後でもし取り出したくなったりしたらどうすべきなのでしょうか? たとえば、どういった処理の場合に使用できるのでしょうか? また、hashCode()はしょっちゅう使用すべきではないのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • ArrayList内HashMapの取得

    基本的で申し訳ないのですが一番下の行で リストの3つめの要素内のkey=key2でyeahをコンソールに出力したいです。 どのように取得すればいいのでしょうか? list.get(2).get("key2")っぽいかんじで... ArrayList list = new ArrayList(); for (int i = 0; i < 5; i++) { HashMap map = new HashMap(); map.put("key1", "hello"); map.put("key2", "yeah"); map.put("key3", "boo"); list.add(map); } System.out.println(list.get(2));

    • ベストアンサー
    • Java
  • mapの値を全件取得

    いつも楽しく拝見させて頂いています。 mapオブジェクトをkeyの昇順でソートし、昇順でソートされた順にmapのvalueを取得したいって思ってます。 下記ソースで方針はあってますでしょうか? しかし下記ソースを実行すると※の行でClassCastExceptionが発生します。 String型にキャストしているつもりなのですが…なぜでしょうか? 初歩的な質問ですが宜しくお願いします。 ----------------------------------------以下ソース Map map = new TreeMap(); map.put(new Integer("12"), "000000000b"); map.put(new Integer("78"), "000000000a"); map.put(new Integer("39"), "000000000c"); map.put(new Integer("234"), "000000000g"); for(Iterator iterator = map.entrySet().iterator();iterator.hasNext();) {   Map.Entry entry = (Map.Entry)iterator.next(); ※ String key = (String)entry.getKey();   String value = (String)entry.getValue();   System.out.println(key + "=" + value);   } ・Jdk1.4.12 ・eclipse 3.0

    • ベストアンサー
    • Java

専門家に質問してみよう