• ベストアンサー

hashMap.getその2

たびたび、ほんとすいませんが またご質問させて下さい。 先ほど、以下の通り教えて頂きまして 訂正したところエラーは出なくなりました。 MyData myData = (MyData) hashMap.get("A"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); データは以下の通りです。 --------------- A,2003/1/1,スイカ B,2003/2/1,バナナ C,2003/3/1,メロン D,2003/4/1,イチゴ --------------- 正しい表示は、 「日付:2003/1/1 名前:スイカ」 と、表示されなければいけませんが 「日付:2003/4/1 名前:イチゴ」 と、一番最後のレコードが表示されてしまいます。 一行追加しても、やはり一番最後のレコードが表示されてしまいます。 System.out.printlnで確認したところ、hashMapのキーはきちんとセットされているようです。 ご教授して頂けたら幸いです。

  • niiza
  • お礼率43% (211/486)
  • Java
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
回答No.2

--------------- import java.io.*; import java.util.*; public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } private static HashMap hashMap = new HashMap(); /*追加:入力キー(クラス変数)*/ public static String inputKey = null; private String[] keys = {}; public static void main(String args[]){ try{ TestMap testMap = new TestMap(); testMap.setMap("test.csv"); /*Keyに対応する出力の判断*/ if(testMap.checkKey(args[0])){ MyData myData = (MyData) hashMap.get("A"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("B"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("C"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("D"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); } else{ System.out.println("対応するKeyが存在しません。"); } }catch(Exception e){} } /*HashMapにKey and Valueをセット*/ public void setMap(String sFileName) throws Exception{ FileReader oFileReader = new FileReader(sFileName); BufferedReader oBufferedReader = new BufferedReader(oFileReader); String sLineData; String Key; ****ここから変更************************************************ MyData oMyData = null;//new MyData(); while((sLineData = oBufferedReader.readLine()) != null) { StringTokenizer oStringTokenizer = new StringTokenizer(sLineData, ","); Key = oStringTokenizer.nextToken(); oMyData = new MyData(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); hashMap.put(Key,oMyData); oMyData = null; *************************************************** } } /*HashMap.put(Object,Object)でセット*/ /*セットされたキーがあるか判定*/ public boolean checkKey(String key){ boolean boolKey = true; boolKey = hashMap.containsKey(key); /*クラス変数のinpuKeyに判定結果によってセットするかどうか*/ if(boolKey){ inputKey = key; } else{ inputKey = null; } return boolKey; } } ループの前でクラスをnewしてたんで一つしかインスタンスが生成されてません。したがってその一つしかないインスタンスに上書きで値が更新されているのが問題です。 ですのでループの中でインスタンス生成して、HashMapにputして下さい。

niiza
質問者

補足

ご返事有り難うございました。 お陰様で解決しました。 okure_donchanさんには、何から何まで本当にお世話になりました。 一つだけ質問したいことがあるんですが、 MyData oMyData = null;//new MyData(); の、「null;//」の意味というのは オブジェクトを空にするという意味なんですか?

その他の回答 (3)

回答No.4

「null;」と「new MyData(); 」は同じ意味と言うことなんでしょうか? 違います。 型宣言している際にクラス型の変数をメソッド内で宣言する際に初期化というのを明示化するためにnullというのを記述したのみです。 MyData myData; //この段階ではMydata型の変数myDataの中味はnull myData = new MyData(); //インスタンス生成しmyDataの中にインスタンスを格納。 と MyData myData = new MyData(); が一緒のなのはわかりますよね。 この上のやつの型宣言の初期化を明示的に行ってるだけです。実際には上記の方法でnullがmyDataに入っています。 でNO.2でやった方法というのはループの外で型宣言だけして、ループの中で一回りごとに新しいインスタンスを生成してそれをHashMapにputするという方法を取っています。 put後にnullを代入するのは初期化の明示化です。 こうしておくことによってイリーガルな値を持つことを防ぎます。 でMapからvalueを取り出す際にkeyに対応したvalue(この場合は作成されたインスタンス)を取り出すのですが。 A = MyData@436463 B = MyData@316303 C = MyData@317421 D = MyData@218230 のように四つのインスタンスを扱っています。

niiza
質問者

お礼

ご返事有り難うございました。 凄く丁寧に書いて頂きまして有り難うございました。 ただ、未熟な私には理解出来ないところもありますが でもなんとなく分かりました。 有り難うございました。

回答No.3

MyData oMyData = null;//new MyData(); //以降はコメントアウトしただけなので。気にせずに。 後この部分では初期化です。宣言しなければ暗黙的に行われますが、メソッド内では行った方が無難です。

niiza
質問者

補足

何度もすいません。 「null;」と「new MyData(); 」は同じ意味と言うことなんでしょうか?

  • hilo256
  • ベストアンサー率18% (3/16)
回答No.1

見たところいいような気がします。 hashMap.putに問題はありませんか? MyData myData = (MyData) hashMap.get("A"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("B"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("C"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("D"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); とやってみましたか? hashMap.put()で間違いがあるとは考えられないでしょうか?

niiza
質問者

補足

ご返事有り難うございました。 早速試してみましたが、4つとも 一番最後のレコードが表示されてしまいます・・・。 以下が全コードなんですが・・・。 大変お忙しいところご面倒かとは思いますが ご教授して頂けたら幸いです。 --------------- import java.io.*; import java.util.*; public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } private static HashMap hashMap = new HashMap(); /*追加:入力キー(クラス変数)*/ public static String inputKey = null; private String[] keys = {}; public static void main(String args[]){ try{ TestMap testMap = new TestMap(); testMap.setMap("test.csv"); /*Keyに対応する出力の判断*/ if(testMap.checkKey(args[0])){ MyData myData = (MyData) hashMap.get("A"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("B"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("C"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); myData = (MyData) hashMap.get("D"); System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); } else{ System.out.println("対応するKeyが存在しません。"); } }catch(Exception e){} } /*HashMapにKey and Valueをセット*/ public void setMap(String sFileName) throws Exception{ FileReader oFileReader = new FileReader(sFileName); BufferedReader oBufferedReader = new BufferedReader(oFileReader); String sLineData; String Key; MyData oMyData = new MyData(); while((sLineData = oBufferedReader.readLine()) != null) { StringTokenizer oStringTokenizer = new StringTokenizer(sLineData, ","); Key = oStringTokenizer.nextToken(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); hashMap.put(Key,oMyData); } } /*HashMap.put(Object,Object)でセット*/ /*セットされたキーがあるか判定*/ public boolean checkKey(String key){ boolean boolKey = true; boolKey = hashMap.containsKey(key); /*クラス変数のinpuKeyに判定結果によってセットするかどうか*/ if(boolKey){ inputKey = key; } else{ inputKey = null; } return boolKey; } }

関連するQ&A

  • hashMap.getについて

    たびたび、ご質問させて頂きます。 申し訳ありません。 hashMap.getについてなんですが 以下のようにhashMapを設定しました。 --------------------- public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } ・ ・ ・ Key = oStringTokenizer.nextToken(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); hashMap.put(Key,oMyData); ----------------- データを取り出したいので、(inputKey)=入力キー --------------- String[] value = (String[]) hashMap.get(inputKey); System.out.println("日付:" + value[1] + " 名前:" + value[2]); --------------- と、したんですが、エラーは出ないもののSystem.out.printlnの箇所でなにも表示されません。 たびたび、ご質問させて頂いて本当に申し訳ありませんが、ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • HashMap.putについて

    ご質問させて頂きます。 hashMap.putの使い方が良く分かりません。 例えば、以下のようなkudamono.csvファイルがあるとします。 ------------------- A,2003/01/01,スイカ B,2003/02/01,バナナ C,2003/03/01,メロン D,2003/04/01,イチゴ ------------------- このデータをhashMap.putでセットしたいので 以下のようなクラスにしたんですが コンパイルエラーが出てしまいます。 ------------------- /*HashMap生成(クラス変数)*/ public static HashMap hashMap = new HashMap(); public static void main(String args[]) throws Exception { FileReader filereader = new FileReader("kudamono.csv"); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 1; int j = 0; while((line = bufferedreader.readLine()) != null) { System.out.println("Start line at " + i); StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { HashMap.put(stringTokenizerTest.nextToken().toString()); j++; } i++; } filereader.close(); } } --------------- たぶんHashMap.putをする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • ArrayListとHashMapを利用する問題について

    『問題』 (1)ArrayListのオブジェクトを生成する。 (2)「何回入力しますか?」と出力し、入力処理を行う。 (3)(2)で入力された回数分、以下の処理を行う。   1)HashMapのオブジェクトを生成する。   2)「名前を入力して下さい。」と出力し、入力処理を行う。 3)「性別を入力して下さい。」と出力し、入力処理を行う。   4)「性別を入力して下さい。」と出力し、入力処理を行う。 5) 1)で作成したHashMapに、それぞれ入力された 名前・年齢・性別を設定する。   6)値を設定したHashMapを(1)で作成したArrayListへ格納する。 (4)ArrayListの件数分、以下の処理を行う。   1)ArrayListより、HashMapを取得する。   2)取得したHashMapより、それぞれ設定されている 名前・年齢・性別を取得する。   3)HashMapより取得した名前・年齢・性別を出力する。 『実行結果』 何回入力しますか? 2 名前を入力して下さい。 iwata 年齢を入力して下さい。 27 性別を入力して下さい。 men 名前を入力して下さい。 hana 年齢を入力して下さい。 21 性別を入力して下さい。 women 名前=iwata 年齢=27 性別=men 名前=hana 年齢=21 性別=women 上記のようなプログラムを書く問題について質問します。 (3)までは自力で書けて実行結果もこの通りになったのですが、 (4)が分からずに、実行結果では値の部分がnullと出力されて しまいました。自分でもこの記述は間違っているというのは感じる のですが、どうしたら値がちゃんと格納されるのか分かりません。 「ArrayListより、HashMapを取得する。」←特にこの部分を どう記述してよいのか・・・ 分かる方、上記の部分の記述方法だけでも構わないので教えて下さい。 『自分で書いたプログラム』 import java.util.*; import java.io.*; public class Sample02{ public static void main(String[] args)throws IOException{ ArrayList list = new ArrayList(); System.out.println("何回で入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); for(int i=0; i<num; i++){ HashMap map = new HashMap(); System.out.println("名前を入力して下さい。"); String name = br.readLine(); System.out.println("年齢を入力して下さい。"); String age = br.readLine(); System.out.println("性別を入力して下さい。"); String sex= br.readLine(); map.put("名前", name); map.put("年齢",age); map.put("性別",sex); list.add(name); list.add(age); list.add(sex); } for(int i=0; i<num; i++){ HashMap map = new HashMap(); String name = (String)map.get("名前"); String age = (String)map.get("年齢"); String sex = (String)map.get("性別"); System.out.println("名前=" + name); System.out.println("年齢=" + age); System.out.println("性別=" + sex); } } }

    • ベストアンサー
    • Java
  • HashMapについて

    質問させてください 以下に簡単なコードをJBuilderで作成しました。 printでブレークをはってmapインスタンスを評価してみると、mapに20個のキーが登録されるはずが、 16個しかいません。 この時点でstr1[16]が評価しても表示されていないのですが、map.get()で正常に取得はできています。 どのようなことが考えられるか、わかる型がいましたら教えてください。よろしくお願いいたします。 import java.util.*; class Test { public static void main(String[]args){ HashMap map = new HashMap(); String str1[] = new String[20]; String str2[] = new String[20]; for(int i = 0; i < 20; i ++){ str1[i] = new String(Integer.toString(i)); str2[i] = new String(Integer.toString(i * 10)); map.put(str1[i],str2[i]); } System.out.println("デバック用ブレーク"); System.out.println(map.get(str1[11])); } }

    • ベストアンサー
    • Java
  • HashMapについて

    【Java-Class】 JavaでDBの終了まで、日付・DB有無フラグを退避する。 【JSP】 DB有無フラグが存在する場合は"・"をカレンダーに表示する。 という処理を行いたいと思います。 HashMapを使用して put(),get()を使用したいと思いますが、get()を実行した際にNullPointerExceptionが表示されてしまいます。 エラーを見る限りではputの際に配列に設定していないのが原因なのではないかと思いますが、 修正方法がよくわかりません。 どうかよろしくお願いします。 ===DBSelect.java================================= CalenderHash hash = new CalenderHash(); /* DB終了まで */ while(rs.next()){ // 値の格納 hash.HashPut(rs.getString(YMD), "1"); } ===CalenderHash.java============================= public class CalenderHash { protected HashMap ht; public CalenderHash(){ } public void HashPut(Object YMD,Object Flg){ ht.put(YMD,Flg); } public Object get( Object key ) { return(ht.get(key)); } ==JSPの一部 ============================ for ( int i=1; i<=6; i++){ out.println("<TR ALIGN='right'>"); out.println("<TD>"); <省略> YearMD = year + month + Day; mark = ""; // 値の取得 if ( hash.get(YearMD).equals("1")){ mark = "・"; } %> <A HREF="/Schedule/jsp/memo.jsp?Ymd=<%= YearMD %> "><%= mark %><%= cntday %></A> &nbsp; <% } out.println("</TD>"); } out.println("</TR>"); }

    • ベストアンサー
    • Java
  • クラスに行って、戻ってくる方法 その2

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=592441 の方で質問させて頂いて、丁寧に答えて頂いたんですが、どうしても分からないので再度ご質問させて頂きます。 以前お答えして頂いたことから、TestMap.javaとjukou.javaを以下のように変更してみました。 jukou.java ------------- public class jukou extends HttpServlet { public jukou() { String sDate; String sName; } public void init(ServletConfig con) throws ServletException { super.init(con) ; } .... /* LOOKUP用処理 */ else if (req.getParameter("map") != null) { jukou x; x = TestMap.method(strings) ; .... TestMap.java ------------- public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } .... //呼び出し MyData myData = (MyData) hashMap.get(inputKey); jukou myData2 = new jukou(myData) ; エラー内容 C:\ja>javac jukou.java jukou.java:95: 互換性のない型 検出値 : void 期待値 : jukou x = TestMap.method(strings) ; ^ jukou.java:205: シンボルを解決できません。 シンボル: 変数 pw 場所 : jukou の クラス pw.println("<html><head>") ; ^ jukou.java:206: シンボルを解決できません。 シンボル: 変数 pw 場所 : jukou の クラス pw.println("<title>エラー</title>") ; ^ など9個 この他にも色々なパターンを試してみましたが、エラーが取れません。ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • HashMap(J2SDK1.4.2_09)について

    import java.util.*; class BubbleSort { public static void Sort(double[] a) { HashMap hmap = new HashMap(); // ☆ int m, i, j; double n, t; for(i=0; i<a.length; i++) { hmap.put(a[i], i); // (1) } for(i=0; i<a.length; i++) { m = hmap.get(a[i]); // (2) if(m >= 9) { System.out.println("キー " + (m+1) + " の値=" + a[i]); } else { System.out.println("キー " + (m+1) + " の 値=" + a[i]); } } } public static void main(String args[]) { double[] a = {7.6, 7.8, 5.6, 4.1, 0.3, 9.9, 1.5, 8.1, 7.1, 5.3}; Sort(a); } } 上記のように、(1)ではkey(main文にある各配列要素)をvalue(keyの要素に対応する番号)に対応付けする、(2)では指定したキーに対応した値を返す、といったことをしたいのですが、エラーが出てしまいコンパイルできません。J2SDK5.0では、☆の部分を、 HashMap<Double,Integer> hmap = new HashMap<Double,Integer>(); のようにすればコンパイル、実行できます。しかし事情があって1.4でしたいのです。どのようにすればできるでしょうか?宜しくお願いします。

    • ベストアンサー
    • 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
  • ArrayListからHashMapの変換

    質問1) ArrayListからHashMapの変換(処理要件は満たすが、より良い方法がないか) 質問2) より良い設計はどうするべきか ※ 長文です。すいません。 == 前提条件:  工程) 保守フェーズ  環境) 3階層のWebシステム(クライアント/AP/DB)、AP実行環境はJava(1.4)、DBはOracle(10g) 処理の目的:  DBに存在するレコードの一覧を画面に表示する。  ただし存在しないレコードはnull(空)表示する。 以下テーブルが存在します。 ----------テーブルイメージ---------------- 内部キー(ID)  表示順序   画面表示名 (以降のカラム省略) ---------------------------------------- 1         1        AAAAAA 2         3        CCCCCC 3         5        DDDDDDD ---------------------------------------- 画面表示は以下です。表示枠は5つ。その他の項目も存在する。 ------------画面表示イメージ-------------- 1: AAAAAA 2: (空) 3: CCCCCC 4: (空) 5: DDDDDDD ----------------------------------------- 現状: DB参照は内製のORマッパを使用します。その内のひとつ、メソッドAは 上記テーブルを対象に3つのDTO(Data Transfer Object)を保持したArrayListを返却します。(orderは内部キー) 一方、画面表示ではkey=Valueでの取扱いが有利なため、HashMapで組んでいます。 このため、新たに構築したHashMapにArrayListの内容を順次展開しながら、Mapに 詰めなおすロジックが必要となっています。 (擬似コード)------ List list = ORマッパ.メソッドA(); Map map = new HashMap(); int order = 0; int listIndex = 0; DTO dto = null; for (int i = 0; i < DISPLAY_MAX_COUNT; i++) {   dto = (DTO)list.get(listIndex);   order = dto.get表示順序();   if (i == order) {     map.put((String)i, dto);      listIndex++;    } else {     map.put((String)i, null);   } } (擬似コード)------ 以上を踏まえ、質問いたします。 質問1) ロジックに対するInput/Outputを変更しない前提で、 ArrayListからHashMapの変換でよりよい方法はないか。 質問2) 仮に設計や製造を一からやりなおすことができるとしたら、 より良い設計はどうするべきか。 長文申し訳ないです。最後まで目を通していただきありがとうございます。

  • args[0]でエラー

    ご質問させて頂きます。 以下のコードは、javaでLOOKUPのような昨日のコードを 以前こちらでサンプルとして作成して頂いたものなんですが、 エラーの方がどうしても取れなくて困っています。 String[] value = testMap.getValue(args[0]); の行でエラーになってしまうのですが args[0]の部分を取ると、コンパイルエラーは取れますが 今度は実行エラーになってしまいます。 args[0]が鍵だと思うのですが どのようにすればいいか分かりません。 ご教授して頂けたら幸いです。 --------------------------------- import java.util.*; public class TestMap { /*HashMap生成(クラス変数)*/ private HashMap hashMap = new HashMap(); /*追加:入力キー(クラス変数)*/ private String inputKey = null; ・ ・ ・ ・ public static void main(String args[]){ TestMap testMap = new TestMap(); testMap.setMap(); /*Keyに対応する出力の判断*/ if(testMap.checkKey(args[0])){ ↓↓↓ここでエラー String[] value = testMap.getValue(args[0]); System.out.println("日付:" + value[0] + " 名前:" + value[1]); } else{ System.out.println("対応するKeyが存在しません。"); } } public TestMap() { } ・ ・ ・ ・ /*KeyからValueを返す*/ public String[] getValue(){ String[] value = (String[])hashMap.get(inputKey); return value; } }

    • ベストアンサー
    • Java