• ベストアンサー

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をする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。

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

  • ベストアンサー
  • nakashi
  • ベストアンサー率51% (21/41)
回答No.7

import java.io.BufferedReader; import java.io.FileReader; import java.util.HashMap; import java.util.StringTokenizer; public class MainClass {  class MyData{   public String sDate;   public String sName;  }  private static HashMap m_oHashMap = new HashMap();  public static void main(String[] sArgs) {   try{    MainClass oMainClass = new MainClass();    oMainClass.vfRead("kudamono.csv");   }catch(Exception e){}  }  private void vfRead(String sFileName)throws Exception{   FileReader oFileReader = new FileReader(sFileName);   BufferedReader oBufferedReader = new BufferedReader(oFileReader);   String sLineData;   String sKey;   MyData oMyData = new MyData();   while((sLineData = oBufferedReader.readLine()) != null) {    StringTokenizer oStringTokenizer = new StringTokenizer(sLineData, ",");    sKey = oStringTokenizer.nextToken();    oMyData.sDate = oStringTokenizer.nextToken();    oMyData.sName = oStringTokenizer.nextToken();    m_oHashMap.put(sKey,oMyData);   }  } }

niiza
質問者

お礼

ご返事有り難うございました。 凄くとても参考になりました。 お陰様で解決しました。

その他の回答 (6)

回答No.6

そもそも設計に欠陥があるようですね。 HashMapなどのマップは、 キー1 → 値1 キー2 → 値2 キー3 → 値3 という形を作りますから、「2列」の表になります。なのにあなたは「3列」の表をそのまま無理に入れようとして失敗しているのです。ここをまず理解すれば次に進めますよ。 すぐ思い付く(けど雑な)方法は、配列(またはリスト)を使って、 "A" → { "A", "2003/01/01", "スイカ" } "B" → { "B", "2003/02/01", "バナナ" } "C" → { "C", "2003/03/01", "メロン" } "D" → { "D", "2003/04/01", "イチゴ" } というマップにするのです。ちょっと書いてみました(未テスト)。 : StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); //----ここから String[] record = new String[3]; while (stringTokenizerTest.hasMoreTokens()) { record[j] = stringTokenizerTest.nextToken().toString(); // 一項目ずつ入れていく j++; } hashMap.put(record[0], record); //----ここまで変更 i++; : 読み出し方は、例えば String[] recordC = (String[]) hashMap.get("C"); System.out.println (recordC[2]);

niiza
質問者

お礼

ご返事有り難うございました。 凄くとても参考になりました。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.5

>kudamono.csvの一番先頭の列(ABCD)をキーにしたいんですが hashMap.put(stringTokenizerTest.nextToken(), line); というのではどうですか。ただこれだと最初の"A"等が、キーと値の両方に入っちゃうけど…。 なお、StringTokenizer.nextToken()はString型が返るので、 toString()は不要でしょう。 "A"を両方に入れたくないなら、 hashMap.put(stringTokenizerTest.nextToken(), stringTokenizerTest.nextToken("")); で、できると思う。(たぶん…) ついでですが、キーも値もStringならば、HashMapのかわりに java.util.Propertiesの使用を検討してはどうでしょう。

niiza
質問者

お礼

ご返事有り難うございました。 >ついでですが、キーも値もStringならば、HashMapのかわりに >java.util.Propertiesの使用を検討してはどうでしょう。 勉強したいと思います。

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

下記に回答ですが、 A,2003/01/01,スイカ というように1行に対して3列ありますよね。 そうするとそうするとhashMapひとつでやろうとすると、 Aというkeyが二つ存在してしまうことになりませんか? 2列目用のHashMapと3列目用のHashMapを宣言しておいてそれぞれにkeyでマッピングしてはどうでしょうか? hashMap2.put("A","2003/01/01"); hashMap3.put("A","スイカ"); って感じで。

niiza
質問者

お礼

ご返事有り難うございました。 >hashMap2.put("A","2003/01/01"); >hashMap3.put("A","スイカ"); とても参考になりました。

回答No.3

質問のソースより抜粋ですが。 >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++; >} この方法では一つのKeyに対して一つのValueしかputできないですね。 またKeyはintではプリミティブ型なので型が合いません。 KeyをObject,String,Integerのどれかにして下さい。

niiza
質問者

お礼

ご返事有り難うございました。 >またKeyはintではプリミティブ型なので型が合いません。 そんなんですね。 とても参考になりました。

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

HashMap.put(stringTokenizerTest.nextToken().toString()); ですが、HashMapはhashMapではないですか? putメソッドはput(Object key, Object value) というのが仕様で、引数が足りません。 キーをセットするというのは正しいと思いますが putをする前ではなくputをするときに同時にkeyをセットするのでは? そして、そのkeyを使用して get(Object key)でデータがとりだせる。 ・・・と思います。

参考URL:
http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/util/HashMap.html
niiza
質問者

補足

ご返事有り難うございました。 liar_adanさんと同じになってしまうのですが 訂正してみましたが コンパイルエラーがエラーが出てしまいます。 hashMap.put(i,stringTokenizerTest.nextToken().toString()); ------------------- コンパイルエラー StringTokenizerTest.java:24: シンボルを解決できません。 シンボル: メソッド put (int,java.lang.String) 場所 : java.util.HashMap の クラス hashMap.put(i,stringTokenizerTest.nextToken().toString()); ^ エラー 1 個 ------------------- それでキーなんですが、 kudamono.csvの一番先頭の列(ABCD)をキーにしたいんですが その場合はどのようにしたらいいんでしょうか?

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

>HashMap.put(stringTokenizerTest.nextToken().toString()); これ、HashMapではなくてhashMapじゃないですか? それから、put()メソッドは値とキーの二つの引数が必要ですが、これでは一つになっています。

niiza
質問者

補足

ご返事有り難うございました。 早速、以下のように訂正してみましたが コンパイルエラーがエラーが出てしまいます。 hashMap.put(i,stringTokenizerTest.nextToken().toString()); ------------------- コンパイルエラー StringTokenizerTest.java:24: シンボルを解決できません。 シンボル: メソッド put (int,java.lang.String) 場所 : java.util.HashMap の クラス hashMap.put(i,stringTokenizerTest.nextToken().toString()); ^ エラー 1 個 ------------------- それでキーなんですが、 kudamono.csvの一番先頭の列(ABCD)をキーにしたいんですが その場合はどのようにしたらいいんでしょうか?