Mapの全件取得とソート方法についての質問

このQ&Aのポイント
  • mapオブジェクトをkeyの昇順でソートし、昇順でソートされた順にmapのvalueを取得する方法を教えてください。
  • 下記のソースコードを実行するとClassCastExceptionが発生します。String型にキャストしているつもりなのですが、なぜでしょうか?
  • 初歩的な質問ですが、ご教示いただけると助かります。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • Ceren
  • ベストアンサー率49% (90/183)
回答No.1

> map.put(new Integer("12"), "000000000b"); キーはIntegerじゃないんですか?

pgBeginImo
質問者

お礼

早速の回答ありがとうございます。 当方のケアレスミスでした。 ご指摘頂いたとおり修正すると直りました。 ありがとうございました。

関連するQ&A

  • TreeMapで昇順ソートされない

    TreeMapで昇順ソートをさせようと思って以下のサンプルプログラムを作成しました。 ところが結果は予想に反して108,28,3,608,8 というようにランダムに数値が表示されました。 put するときに mapRecordNumKind.put(108, "あ"); というようにkeyをintにしてみたところ昇順に表示させることができました。 インターネットで見たサンプルではkeyの数値をStringでputしていたのですが そもそも参照したページが誤っていてTreeMapはString型の数値では昇順ソートされないもの なのでしょうか。   TreeMap<String,String> mapRecordNumKind = new TreeMap<String,String>();   mapRecordNumKind.put("108", "あ");   mapRecordNumKind.put("3", "い");   mapRecordNumKind.put("8", "う");   mapRecordNumKind.put("28", "え");   mapRecordNumKind.put("608", "お");   Iterator<String> its = mapRecordNumKind.keySet().iterator();      while(its.hasNext()) {     String key = its.next();     System.out.println(key);   }

    • ベストアンサー
    • Java
  • java のMAPをソートするとき

    以下のプログラムがあったとします、 Map<Integer, String> map = new HashMap<Integer, String>(); map.put( 0 , "abc" ); map.put( 4 , "efg" ); map.put( 1 , "hij" ); map.put( 3 , "klm" ); map.put( 2 , "npo" ); これで、mapのキーをソートするにはどうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • Java。以下のソースをご覧下さい。

    配列ですが、現在の一覧表示を上位10件で表示したいのですが、教わって書いたソースのため、どう手をくわえればいいか分かりません・・・ ご教示お願いします。 //以下ソースです。ほぼ表示ロジックのみですが、足りなければ別途追記致します。 <前略> Iterator<String> ir = hsFlow.keySet().iterator(); while(ir.hasNext()){ ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(); list.addAll((new HashMap<String,Integer>(hsFlow)).entrySet()); Collections.sort(list,Collections.reverseOrder(new SampleSorter())); for(Map.Entry<String,Integer> m:list){ System.out.println(m.getKey()); System.out.println(m.getValue()); String f = ir.next(); Integer c = hsFlow.get(f); if(c==null) c = new Integer(0); System.out.println("回数"+f+":"+c.intValue()+"回"); //この回数表示の部分で回数の多い上位10件のみの表示にしたいと思っています。

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

  • Mapに登録した値を登録した順に取り出したいです。

    Mapに登録した値を登録した順に取り出したいです。 TreeMapを使えば順番に取れるという風に書いてありましたが、 どうもキーの昇順で出ているようで、こちらの希望する出し方ができません。 私は登録した順番で取りたいのですが、どの様にすればよいでしょうか。 ちなみに、マップのキー、値ともにString型です。

    • ベストアンサー
    • Java
  • JAVA 二分探索木トラバーサルのコンパイル時警告

    下記のTreeMaptest01.javaをコンパイルした時、次のような警告が出ます。 この警告が出ないようにする方法を教えてください。 よろしくお願いします。 % javac -Xlint:unchecked TreeMaptest01.java TreeMaptest01.java:92: 警告:[unchecked] 無検査変換です 検出値 : decorder 期待値 : java.util.Comparator<? super java.lang.String> TreeMap<String,String> s = new TreeMap<String,String>(new decorder()); ^ 警告 1 個 /*=========TreeMaptest01.java=========================================== import java.util.*; class decorder implements Comparator { public int compare(Object obj1, Object obj2) { int c = ((String)obj1).compareTo((String)obj2); return -c; } } class TreeMaptest01 { public static void main(String args[]) { // 空のマップを作成。 TreeMap<String,String> tm = new TreeMap<String,String>(); // キーと値の組を追加。 tm.put("C","Car"); tm.put("A","Airplane"); tm.put("B","Book"); tm.put("E","Earth"); tm.put("D","Door"); // キーと値のすべての組を昇順にたどる。 System.out.println("キーと値のすべての組を昇順にたどる"); Set a = (Set)(tm.keySet()); Iterator ia = a.iterator(); while( ia.hasNext() ) { Object key = ia.next(); System.out.println("キー:" + key + " 値:" + (String)tm.get(key)); } System.out.println(); // 空のマップを作成。 // ここでエラー(警告が出る) TreeMap<String,String> s = new TreeMap<String,String>(new decorder()); // キーと値の組を追加。 s.put("C","Car"); s.put("A","Airplane"); s.put("B","Book"); s.put("E","Earth"); s.put("D","Door"); // キーと値のすべての組を降順にたどる。 System.out.println("キーと値のすべての組を降順にたどる"); Set b = (Set)(s.keySet()); Iterator ib = b.iterator(); while( ib.hasNext() ) { Object key = ib.next(); System.out.println("キー:" + key + " 値:" + (String)s.get(key)); } } } =======================================================================*/

  • 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
  • Java、treemap のソートについて

    以下のプログラムなのですが、 TreeMap<Integer, String> map = new TreeMap<Integer, String>(); map.put( "99","あいうえお" ); map.put( "0","かきくけお" ); map.put( "99","さしすせそ" ); map.put( "99","たちつてと" ); map.put( "99","なにぬねの" ); というのがあり、おそらくTreeMapではキー重複禁止されているので実際には2つのデータしか入らないと思われます。mapに入るのは、 map.put( "0","かきくけお" ); map.put( "99","なにぬねの" ); だと思います。 質問は「ソートした後に先頭を取り出す方法」です。 キーで取り出すのではなく、mapの最初のものを取り出すにはどうしたらいいでしょうか? map.get(0); ではないですよね???

    • ベストアンサー
    • Java
  • 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の要素の削除と挿入

    こんにちは。 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

専門家に質問してみよう