- ベストアンサー
HashMapについて
java初心者です。 HashMap oya= new HashMap(); HashMap child=null; child = new HashMap(); child.put("test1",Object1); child.put("test2",Object2); oya.put("Oya1",child); child = new HashMap(); child.put("test3",Object3); child.put("test4",Object4); child = new HashMap(); oya.put("Oya2",child); 上記のように値をセットした状態で ループの中でtest1の値を比較したいのです。 たとえば下記みたいに下記のやり方では出来なのは分かっています 値の比較の仕方を教えてください。 for(int i=0;oya.size();i++){ if(test1.equals("aaaa")){ bbb = "kkk"; break; } } よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>> Object1やObject2は変数でしょうか? そうだとしたら、その型は何でしょう? > 変数で、boolean型です。 Javaではクラス名を大文字で始め、変数名は小文字で始めるのが標準的なので、覚えておくといいですよ。そのほうがコードを読む人が混乱しません。 > 以下のようなことをHashMapを使ってやりたいのです。 元々の質問文ではtest1.equals("aaaa")という文字列の比較だったものが、今回の補足ではaaa[i]==falseとbooleanの比較になっています。何を何と比較したいのかが相変わらず分かりづらいです。 ちょっと整理しますが、 1. oyaというHashMapには、キーの文字列("Oya1", "Oya2")と子HashMapの対応が入っている 2. 子HashMapには、キーの文字列("test1", "test2"など)とbooleanの対応が入っている ここまでは合っていますね? 知りたいことは何ですか? a. oyaに入っている子HashMapを1つずつ取り出すようなループの書き方 b. 子HashMapにキー"test1"を与えて、booleanの値を取り出す方法 c. 前項で取り出したbooleanの値を、定数falseと比較する方法 d. 上に書かれていることはどれも知りたいことと関係ない e. その他 もしa.ならば、oya.values()を呼ぶとCollectionが返ってくるので、そのiterator()メソッドを呼んで、Iteratorでループを回せばいいんじゃないでしょうか。これだと"Oya1"などのキー文字列は使いません。 ただ、元々の質問が「値の比較の仕方を教えてください」なのでこれは違うかなという気がします。
その他の回答 (7)
- choconamacream
- ベストアンサー率44% (152/338)
あぁ・・。ひっさしぶりに来たもんだから、混乱させてしまったみたいですね。 私が「アドバイス」として回答したNo.7の内容は、質問者さんとか既に回答された特定の方向けといったものより、あくまで第三者的なものです。いかんせん、こちらのサイトでは、「はてな」とかと違って一旦締め切ってしまうと、後からの追記が出来にくくなってしまいますから。(よって、そのままスルーでも良かったのですが。) 最初は、MapだからgetValueメソッドを使えばいいんじゃないかなと思ったのですが、とりあえずはNo.4の補足欄にあったソースを (build 1.5.0_18-b02)で実行。ただ、それではうまくいかなかったので少しばかり修正した内容をここに追記してみました。(が、かな~りおせっかいだったようで。) [JDK5以降(JDK6など)でのコレクション使用時] ・ジェネリックスを使用。(コレクションのインスタンス生成時に、型引数<K,V>によって格納できる型を指定。) ・明示的なキャストは不要。(JDKが内部でうまく処理してくれる。) [JDK1.4以前(JDK1.3など)でのコレクション使用時] ・ジェネリックスの使用は不可能。(未対応のため。) ・明示的なキャストが必要。(うまくいかないと、ClassCastExceptionをスロー。) >指摘されたとおりにキャスト削除できるか、試してみますね。 たぶん、質問者さんのjavaのバージョンではジェネリックスは未対応だと思いますので、キャストの削除は出来ないと思います。(JDKに怒られると思う。) 基本的に、1つのPC内に異なるJDKのバージョンをいくつもインストールして利用する事は可能です。それじゃあ、どういうふうに使い分けるのかというと、ポイントは「環境変数PATH」の設定です。実際には、PATHの設定をしなくてもJDKをインストールしただけでJavaの開発は出来るのですが、その場合には、どのバージョンのJDKを使用するのかを絶対パスで指定するわけです。ただ、それではとても長くなってしまうので、相対パスを使って「javac」とか「java」のコマンドを使用したいという方は、環境変数PATHに使用したいJDKのバージョンのbinディレクトリまでのパスを指定するわけです。(別バージョンのJDKを使用する時には、毎回そこを修正する。) もっとも、最新のJDKをインストールしていれば、「-source 1.4」や「-source 5」といったオプションを用いて簡単に別バージョンとしてコンパイルする事も可能です。(Eclipseなどでは、これとおんなじようなことを、GUI上で実現しているんだと思う。)
お礼
いろいろと勉強になりました。 ありがとうございました。
- choconamacream
- ベストアンサー率44% (152/338)
ちゃんと、lnumに2が入っていましたね。 JDK5以降で、「-Xlint:unchecked オプションを指定して~」などと表示される方は、以下のように型引数を2つ指定すればいいと思う。 HashMap<String,HashMap> oya = new HashMap<String,HashMap>(); HashMap<String,String> child = null; child = new HashMap<String,String>(); あと、if文中の不要なキャストの削除2つも忘れずに。
お礼
javaのバージョンの関係でHashMapの型の指定はできないみたいです。 >あと、if文中の不要なキャストの削除2つも忘れずに。 (Boolean.parseBoolean(((HashMap)oya.get(key)).get("aaa").toString())).booleanValue() == falseとしないとコンパイルが通らなかったです。 指摘されたとおりにキャスト削除できるか、試してみますね。 ありがとうございました。
- salsberry
- ベストアンサー率69% (495/711)
> 特に知りたいのはaです。 aのやり方はNo.3に書いてありますが、実際に試してみましたか? コードで書けばこんな感じ。 Collection values = oya.values(); Iterator iter = values.iterator(); while (iter.hasNext()) { HashMap ko = (HashMap)iter.next(); // 子HashMapであるkoに対する操作をここに書く } なお、最近のJavaならば本当はHashMapなどに対してgenericsを使いたいところですが、本題から外れるので省略します。 あとNo.4さん、 > child = new HashMap();とした時点で、恐らくoya1の持つchildの中身も変わってしまいませんか? この心配は無用です。
お礼
書いていただいたコードを参考とさせていただきました。 ありがとうございました。
- coopy72v
- ベストアンサー率12% (1/8)
↓3行目 child.get です…orz
- coopy72v
- ベストアンサー率12% (1/8)
質問を取り違えていたら申し訳ないです とりあえず…値の取得方法はご存知なのでしょうか? test1をキーに持つobject1を何かと比較するならば、chilg.get("test1")で、object1を取得できるので、それを使って比較します… また、HashMapはobject型出なければならないのでboolean型は無理です Boolean型なら大丈夫。型の違いについては検索してください 少し気になるのが child = new HashMap(); child.put("test1",Object1); child.put("test2",Object2); oya.put("Oya1",child); おそらくここまでで、oya1の中に、child(それに含まれるtest1とtest2)を持たせて child = new HashMap(); child.put("test3",Object3); child.put("test4",Object4); child = new HashMap();←これは間違え? oya.put("Oya2",child); ここまでで、oya2の中にはchild、それに続くtest3とtest4を持たせて という感じなのかな?と思うのですが child = new HashMap();とした時点で、恐らくoya1の持つchildの中身も変わってしまいませんか? 確信があって…ではないですので、間違っていたら本当に申し訳ないのですが これが正しかった場合、oya1とoya2の中身は「同じ物」のまま、childの変更に合わせて変わっていく気がします…
補足
回答ありがとうございます。 皆さんの意見を参考に自分なりにやってみましたが、、 こんな感じでいいのでしょうか。 HashMap oya = new HashMap(); HashMap child=null; child = new HashMap(); child.put("aaa","true"); child.put("bbb","1"); child.put("ccc","さしすせそ"); child.put("ddd","たちつてと"); oya.put("oya_1",child); child = new HashMap(); child.put("aaa","false"); child.put("bbb","2"); child.put("ccc","まみむめも"); child.put("ddd","らりるれろ"); oya.put("oya_2",child); long lnum=0; Set set = oya.keySet(); Iterator iter = set.iterator(); while(iter.hasNext()){ Object key = iter.next(); if( Boolean.parseBoolean(((HashMap)oya.get(key)).get("aaa").toString()) == false) lnum = Long.parseLong(((HashMap)oya.get(key)).get("bbb").toString()); break; } }
- OKbokuzyo
- ベストアンサー率43% (130/296)
#1さんと同様に何を聞きたいのかはよくわかりませんが‥ HashMap内に、あるオブジェクトが含まれているかどうかを調べたいなら for文を使わなくともcontainsValueメソッドが使えます。 // "aaaa"というStringオブジェクトを1つ以上持つならtrueを返す child.containsValue("aaaa"); また、Keyを調べたいならcontainsKeyメソッドが使えます。 // "test1"というキーをchildが保持するならtrueを返す child.containsKey("test1"); ※ HashMapに限った話ではないですが、contains系のメソッドは内部的には引数で指定したオブジェクトのクラスのequalsメソッドによる比較が行われていることには注意してください。
お礼
containsValueの使い方もこれから勉強いたします。 ありがとうございました。
補足
分かりにくくて申し訳ありません。 oya(key,child)セットされているchildのkeyに関連付けられている値をoyaの数だけループして判定したのですが。もともと配列に格納されている値の判定をやっていたのですが、HashMapを使うことになったので、こういう処理が要求されています。
- salsberry
- ベストアンサー率69% (495/711)
何を何と比較したいのか、文面から読み取るのが難しいです。 「test1の値を比較したい」とありますが、上半分のコードには"test1"という文字列は出てくるのに対して下半分のコードに出てくるtest1は変数のように見えます。 また、Object1やObject2は変数でしょうか? そうだとしたら、その型は何でしょう? 「"test1"という文字列に関連づけられた変数Object1の内容を文字列"aaaa"と比較したい」ということかと想像しましたが、合っていますか?
補足
すみませんわかりにくい質問で。 「test1の値を比較したい」とありますが、上半分のコードには"test1"という文字列は出てくるのに対して下半分のコードに出てくるtest1は変数のように見えます。 >下のコードのtest1はchildのキーです。 また、Object1やObject2は変数でしょうか? そうだとしたら、その型は何でしょう? >変数で、boolean型です。 「"test1"という文字列に関連づけられた変数Object1の内容を文字列"aaaa"と比較したい」ということかと想像しましたが、合っていますか? >合っています。childのtest1に関連付けれたObject1をOyaの数だけ比較したいのです。 以下のようなことをHashMapを使ってやりたいのです。よろしくお願いいたします。 for (int i=0;i<Count;i++) { if (aaa[i]==false || bbb[i]==false) { ttt=false; break; } }
お礼
まとまりのない質問に丁寧な回答ありがとうございました。 皆さんのような方々がいるので初心者PGにとって心強いです。
補足
回答ありがとうございます。 >ちょっと整理しますが、 >1. oyaというHashMapには、キーの文字列("Oya1", "Oya2")と子HashMapの対応が入っている >2. 子HashMapには、キーの文字列("test1", "test2"など)とbooleanの対応が入っている >ここまでは合っていますね? 合っております。 a,b,cいずれも処理をしなければならないのですが、特に知りたいのは aです。 よろしくお願いいたします。