• ベストアンサー

Mapの要素の削除と挿入

こんにちは。 Listに挿入されたMapでKeyがFLGのValueが1のものを List要素ごと削除しFlgが0のものに新しくmap.put("LBL","○");したいのですがどうもうまくいきません。 getListMap()はTestListクラスにあるMapの挿入されたリストを返すメソッドです。 よろしくお願いします。 Mapの中身はこのようになっています。 [key=TYPE:value=AAA0] [key=NO:value=000] [key=FLG:value=1] [key=TYPE:value=AAA1] [key=NO:value=001] [key=FLG:value=0] [key=TYPE:value=AAA2] [key=NO:value=002] [key=FLG:value=1] [key=TYPE:value=AAA3] [key=NO:value=003] [key=FLG:value=1] [key=TYPE:value=AAA4] [key=NO:value=004] [key=FLG:value=1] [key=TYPE:value=AAA5] [key=NO:value=005] [key=FLG:value=0] [key=TYPE:value=AAA6] [key=NO:value=006] [key=FLG:value=1] [key=TYPE:value=AAA7] [key=NO:value=007] [key=FLG:value=0] [key=TYPE:value=AAA8] [key=NO:value=008] [key=FLG:value=1] [key=TYPE:value=AAA9] [key=NO:value=009] [key=FLG:value=1] public class Test { public static void main(String[] args) { TestList tl = new TestList(); List list = tl.getListMap(); for (int i = 0; i < list.size() ; i++){ Map map = (Map)list.get(i); Set keyset = map.keySet(); Iterator it = keyset.iterator(); System.out.println("-------------------"); while(it.hasNext()){ Object key = it.next(); if(map.get(key)=="1"){ list.remove(i); }else{ map.put("LBL","○"); } System.out.print("[key=" + key); System.out.println(":value=" + map.get(key)+"]"); } } } }

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

  • ベストアンサー
  • grace2973
  • ベストアンサー率66% (16/24)
回答No.2

間違っているポイントが3つあります。 1.文字列の比較は equals メソッドを使う 2.keyがFLGかどうかを判断していない (というより"FLG"でgetすれば良いのでは?) ↑は、既に#1の方に指摘して頂いてますね。 3.リストの要素を削除したときは、for文のカウンタを増やしてはいけない ↑は [AAA0] [AAA1] [AAA2] とあって、0番目を削除して i を増やしてしまうと [AAA1] ← これが0番目 [AAA2] ← これが1番目 になり、次に判定する i 番目 (1番目ですね ) は [AAA2]になるので、[AAA1]の要素の判定が飛ばされてしまう。

DRAGONEMK
質問者

お礼

足りないところだらけでした。 3については結果を見てなんとなくそんな気がしていたのですが、具体的に説明して頂いたので、 すごくよくわかりました。ありがとうございました。

その他の回答 (2)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

追加です。 マップからキーを取得するのにはイテレータを使っているのに、リストからマップを取得するのにはイテレータを使っていないのはなぜ? イテレータを使えば grace2973 氏が指摘されているようなインデックスの値に関するミスもありませんよ。

DRAGONEMK
質問者

お礼

ありがとうございます。 なぜと言われて答えられるだけの理由はないのですが、 その後自分でも調べて コレクションの繰り返し取得にはイテレータを使った方がよいということが良くわかりました。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

> if(map.get(key)=="1"){ 文字列内容の比較は==演算子ではなくequalsメソッドで行わなければなりません。詳しくは過去質問検索してください。 あと、valueが1であるかどうか判定する前にkeyがFLGであるかどうか判定する必要があると思います。

DRAGONEMK
質問者

お礼

なるほど頂いたアドバイスを参考に 解決しましたありがとうございます。

関連するQ&A