- ベストアンサー
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をする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。
- みんなの回答 (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); } } }
その他の回答 (6)
- mulukhiyya
- ベストアンサー率54% (12/22)
そもそも設計に欠陥があるようですね。 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]);
お礼
ご返事有り難うございました。 凄くとても参考になりました。
- liar_adan
- ベストアンサー率48% (730/1515)
>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の使用を検討してはどうでしょう。
お礼
ご返事有り難うございました。 >ついでですが、キーも値もStringならば、HashMapのかわりに >java.util.Propertiesの使用を検討してはどうでしょう。 勉強したいと思います。
- hilo256
- ベストアンサー率18% (3/16)
下記に回答ですが、 A,2003/01/01,スイカ というように1行に対して3列ありますよね。 そうするとそうするとhashMapひとつでやろうとすると、 Aというkeyが二つ存在してしまうことになりませんか? 2列目用のHashMapと3列目用のHashMapを宣言しておいてそれぞれにkeyでマッピングしてはどうでしょうか? hashMap2.put("A","2003/01/01"); hashMap3.put("A","スイカ"); って感じで。
お礼
ご返事有り難うございました。 >hashMap2.put("A","2003/01/01"); >hashMap3.put("A","スイカ"); とても参考になりました。
- okure_donchan
- ベストアンサー率54% (25/46)
質問のソースより抜粋ですが。 >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のどれかにして下さい。
お礼
ご返事有り難うございました。 >またKeyはintではプリミティブ型なので型が合いません。 そんなんですね。 とても参考になりました。
- hilo256
- ベストアンサー率18% (3/16)
HashMap.put(stringTokenizerTest.nextToken().toString()); ですが、HashMapはhashMapではないですか? putメソッドはput(Object key, Object value) というのが仕様で、引数が足りません。 キーをセットするというのは正しいと思いますが putをする前ではなくputをするときに同時にkeyをセットするのでは? そして、そのkeyを使用して get(Object key)でデータがとりだせる。 ・・・と思います。
補足
ご返事有り難うございました。 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)
>HashMap.put(stringTokenizerTest.nextToken().toString()); これ、HashMapではなくてhashMapじゃないですか? それから、put()メソッドは値とキーの二つの引数が必要ですが、これでは一つになっています。
補足
ご返事有り難うございました。 早速、以下のように訂正してみましたが コンパイルエラーがエラーが出てしまいます。 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)をキーにしたいんですが その場合はどのようにしたらいいんでしょうか?
お礼
ご返事有り難うございました。 凄くとても参考になりました。 お陰様で解決しました。