• ベストアンサー

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)+"]"); } } } }

  • Java
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • LISTとMAPについて

    以下のように記述されたコードで 他クラスからこのクラスのインスタンスを生成して tempMapのkeyとValueを抜き出したいのですが なにか良い方法ありますでしょうか? 宜しくお願いします。 public class TestListMap { protected List list = null; private Map tempMap = null; public TestListMap(){ list = new ArrayList(); for(int i=0; i < 10; i++ ){ tempMap = new HashMap(); tempMap.put("NO", "00" + i); tempMap.put("TYPE", "AAA" + i); if (i % 2 == 0 | i % 3 == 0) { tempMap.put("FLG", "1"); } else { tempMap.put("FLG", "0"); } list.add(tempMap); } } public List getListMap(){ return list; } }

    • ベストアンサー
    • Java
  • ListからMapを作成 MapのValueにはListをput

    すみません、どなたか教えて下さい。 あるListからMapを作成したく、同じkeyが存在する場合、valueのListへ値を追加したいですのですがConcurrentModificationExceptionエラーが返されてしまいます。エラーを返さないように変数を使い分け工夫したつもりですが。。。((1)でmapAにもaddされている!?)他に良い方法はないでしょうか? Map mapA = new TreeMap(); Map mapB = new TreeMap(); Iterator it = listA.iterator(); while (it.hasNext()) { Bean bean = (Bean)it.next(); List mapvaluelist = new ArrayList(); if (mapA.size()==0){ mapvaluelist.add(bean); mapA.put(bean.getName(),mapvaluelist); }else{ if (mapB.size()!=0){ mapA = mapB; } Set keyset = mapA.keySet(); Iterator itmap = keyset.iterator(); while (itmap.hasNext()){ String mapkey = (String)itmap.next(); if (bean.getName().equals(mapkey)){ mapvaluelist = (List)mapA.get(mapkey); mapvaluelist.add(bean); mapB.put(bean.getName(),mapvaluelist); (1) }else{ mapvaluelist.clear(); mapvaluelist.add(bean); mapB.put(bean.getName(),mapvaluelist); } } } }

  • 2つのリストのマージ方法について

    2つのリストのマージ方法について 下記の要件を満たしたいと考えています。 ・リスト1・2をkeyをキーにマージしたい。  リスト1[0]:key=2, value1=b  リスト1[1]:key=3, value1=d  リスト1[2]:key=4, value1=e  ・  ・  ・  リスト2[0]:key=1, value2=A  リスト2[1]:key=2, value2=B  リスト2[2]:key=5, value2=F  リスト2[3]:key=6, value2=G  ・  ・  ・  ↓  リスト3[0]:key=1, value1=A, value=""  リスト3[1]:key=2, value1=b, value=B  リスト3[2]:key=3, value1=d, value=""  リスト3[3]:key=4, value1=e, value=""  リスト3[4]:key=5, value1="", value=F  リスト3[5]:key=6, value1="", value=G  ・  ・  ・ ・リスト1・2はkeyの昇順でソート済。各リスト内では重複しているkeyはない。 ・マージ後もkeyの昇順にしたい。 ・実際のリストはそれぞれ数万件~数十万件なので、パフォーマンスを考慮したい。 下記のように作成してみたのですが、無理やりやりました感があり、分かりづらくバグがありそうです。またループでnewもしてたりしてパフォーマンスも悪そうです。もっとスマートにパフォーマンスもよい方法がないでしょうか? int checkedCount = 0; for (int i = 0; i < list1.size(); i++) { String str1 = list1.get(i).get("key"); for (int j = checkedCount; j < list2.size(); j++) { Map<String, String> map3 = new HashMap<String, String>(); String str2 = list2.get(j).get("key"); if (str1.compareTo(str2) < 0) { if (i != list1.size() - 1) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", ""); list3.add(map3); break; } else { Map<String, String> map4 = new HashMap<String, String>(); map4.put("key", str2); map4.put("value1", ""); map4.put("value2", list2.get(j).get("value2")); list3.add(map4); } } else if (str1.compareTo(str2) == 0) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; break; } else { map3.put("key", str2); map3.put("value1", ""); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; } } }

    • ベストアンサー
    • Java
  • mapによるkeyとvalueのinsertに失敗しております。

    STLのmapコンテナにて、 valueを取得したり、 keyとvalueを登録するソースを書いていました。 get(key)にあたって、 valの取得に失敗した際には、 mapコンテナ上のkey-valueデータと 同期されているMySQLより、 データを取得してきます。 MySQLよりkeyに対応するvalの取得が 完了したら、 そのkeyとvalをmapコンテナに insertしたいと思っています。 つきまして、 insertを行おうと、 「_container.insert(std::make_pair(key, val));」の一文を ソースに挿入したところ、 「型が違う!」という内容(?)のエラー文で コンパイル時に怒られてしまいました。 ただ、「どの様に直してごらん!」と エラー文が言っているのか、 今いち、意味を理解できないでいます。 このエラー情報的には、 どんな風の型の改善を求められているのでしょうか? 教えていただけるとありがたいです。 もし可能でしたら、pointBの 「_container.insert(std::make_pair(key, val));」の部分で、 MySQLから取得済みkeyとvalを、 pointAのkeyとvalに代入する方法も 教えていただけるとありがたいです。 どちらかでも、 アドバイスをいただけますとありがたいです。 どうぞ宜しくお願い致します。 -------------------------------------------------- template<typename KEY, typename VALUE> class hoge : public service_object<ipl<KEY, VALUE>> { virtual void put(key_type key, value_type val) { _container.insert(std::make_pair(key, val)); // pointA } virtual cc::fu<value_type> get(key_type key) { typename container_type::iterator iterator = _container.find(key); if (iterator != _container.end()) { return cc::fu<value_type>((*iterator).second); }else { //getにした場合MySQLよりkeyとvalueを取得完了できるので取得した。 /* MySQLより取得したkeyとvalをpointAのようにmapコンテナにinsertしたい。*/ _container.insert(std::make_pair(key, val)); //pointB  } } }; -------------------------------------------------- ■エラー文 error: conversion from std::pair<std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_ptr<csx::basic_message_cons<csx::basic_message<void, char> > > > >, bool>’ to non-scalar type ‘csrpc::future<boost::shared_ptr<csx::basic_message_cons<csx::basic_message<void, char> > > >’ requested

  • mapの値を全件取得

    いつも楽しく拝見させて頂いています。 mapオブジェクトをkeyの昇順でソートし、昇順でソートされた順にmapのvalueを取得したいって思ってます。 下記ソースで方針はあってますでしょうか? しかし下記ソースを実行すると※の行でClassCastExceptionが発生します。 String型にキャストしているつもりなのですが…なぜでしょうか? 初歩的な質問ですが宜しくお願いします。 ----------------------------------------以下ソース Map map = new TreeMap(); map.put(new Integer("12"), "000000000b"); map.put(new Integer("78"), "000000000a"); map.put(new Integer("39"), "000000000c"); map.put(new Integer("234"), "000000000g"); for(Iterator iterator = map.entrySet().iterator();iterator.hasNext();) {   Map.Entry entry = (Map.Entry)iterator.next(); ※ String key = (String)entry.getKey();   String value = (String)entry.getValue();   System.out.println(key + "=" + value);   } ・Jdk1.4.12 ・eclipse 3.0

    • ベストアンサー
    • Java
  • std::mapの要素を別のキーに移動したいのですがどうしたら良いでし

    std::mapの要素を別のキーに移動したいのですがどうしたら良いでしょうか。 例 map<int, list<string>> m; キー|値 1 |"aaa","bbb" 2 |"ccc" ↓ キー|値 2 |"ccc" 3 |"aaa","bbb" 検索して削除して挿入を考えましたがもっと効率の良い方法はあるのでしょうか?

  • Mapの扱いについて

    いつもお世話になっております。 ただ今Java1.3にてMapを使用したプログラムを作成しております。 String[] hoge = {"0","0","0","0"}; String[] key = {"いいい","ううう","えええ"}; int[] point = {0,1,3}; String[] value = {"5","8","2"}; Map map = new HashMap(); map.put("あああ",hoge); map.put("いいい",hoge); map.put("ううう",hoge); map.put("えええ",hoge); map.put("おおお",hoge); for (int i=0; i < key.length; i++) { String[] wk_hoge = (String)map.get(key[i]); wk_hoge[point[i]] = value[i]; map.put(key[i],wk_hoge); } 上記のように記述し、結果としては あああ="0","0","0","0" いいい="5","0","0","0" ううう="0","8","0","0" えええ="0","0","0","2" おおお="0","0","0","0" としたいのですが、実際の結果が あああ="5","8","0","2" いいい="5","8","0","2" ううう="5","8","0","2" えええ="5","8","0","2" おおお="5","8","0","2" となってしまいます。 なぜそのようになってしまうのか原因がわかりません。 どなたかアドバイスをお願い致します。

    • ベストアンサー
    • Java
  • HashMap要素の操作について

    過去質問を検索致しましたが、適当な質問を見つけられなかった為、質問をさせて頂きます。 ●下記コードのうち、AブロックとBブロックとでどのように異なる為、 Aブロックの値操作が、そのままHashMapへ反省されてしまうのかをご教示願えませんでしょうか? コメント"Aブロック"部分でのArrayList型変数へ操作した内容は、そのままHashMap内の当該キー要素に反映されてしまいます。 コメント"Bブロック"で行う、String型への操作は、HashMap内の当該キー要素に反映はされません。 ■実行環境 ・jdk1.3.1_11 ・Windows XP pro SP2 _________________________________________________ HashMap testMap = new HashMap(); // マップへArrayListとStringを追加 testMap.put("KEY_LIST", new ArrayList()); testMap.put("KEY_STRING", "stringVal"); // Aブロック ArrayList testList = (ArrayList) testMap.get("KEY_LIST"); testList.add("one"); testList.add("two"); testList.remove(0); // Bブロック String testString = (String) testMap.get("KEY_STRING"); testString = "one"; testString = ""; _________________________________________________

    • ベストアンサー
    • Java
  • セレクトボックスのvalue値でactionを変更

    いつもお世話になっております。 メニュー(セレクトボックス)のvalue値によってフォームのactionの内容を変更する方法を探しています。 【JavaScript】ラジオボタンにより、formのaction内容を変更 http://okwave.jp/qa/q6003560.html という質問を見つけ、こちらのラジオボタンをセレクトボックスに変更したのですが、動作しません。 javascriptを変更しなくてはいけないのだとは思うのですが、まったくの素人のため、検討もつかず、相談に伺いました。 <script type="text/javascript"> <!-- function check(f){ var r=f.elements["aaa"]; var flg=false; var list={"A":"aaa.php","B":"bbb.php","C":"ccc.php"}; for(var i=0;i<r.length;i++){ if(r[i].checked){ f.action=list[r[i].value]; flg=true; break; } } } //--> </script> </head> <body> <form action="" onSubmit="return check(this)"> <input name="key" type="text" value=""> <select name="aaa"> <option value="" selected>Category</option> <option value="A">AAA</option> <option value="B">BBB</option> <option value="C">CCC</option> </select> <input type="button" value="Go"> </form> </body> </html> お分かりになる方、教えていただけると助かります。 よろしくお願いいたします。

  • MapからListへ

    どなたか教えてください。 Mapからあるvalueの値のkeyの値をListへ追加していきたいのですがどのようにしたらよいでしょうか? testmap.put(1,TEST1) testmap.put(2,TEST2) testmap.put(3,TEST1) ・ ・ ・ testmapのvalue値「TEST1」のkey1、3をListへ追加したいです。

    • ベストアンサー
    • Java

専門家に質問してみよう