• ベストアンサー

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

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

うむ。Map<?,?>自体にはその機能は無いのだよ。 ではどうするかというと、Map<?,?>とHashMap<?,?>の変わりにSortedMap<?,?>とTreeMap<?,?>を使うのだ。質問文のそれに対して具体的に言うとHashMapをTreeMapに変えるだけでいい(理由はキーがIntergerだから)。 java.util.Map<Integer, String> map = new java.util.TreeMap<Integer, String>(); map.put( 0 , "abc" ); map.put( 4 , "efg" ); map.put( 1 , "hij" ); map.put( 3 , "klm" ); map.put( 2 , "npo" ); MapインターフェースとHashMapクラスは、キーバリューをペアを保持するためのクラスであり、各エントリーに順序は無いという考えのものだ。それに対し、SortedMapインターフェースとTreeMapクラスは各エントリー間の重み付け(優先順位)を設定する機能を追加で提供しており、IntegerやStringがキーである場合は適切な順序で並び替えてくれる。自作のクラスをキーにする場合はComparableインタフェースを実装して2つのインスタンス間でどっちが前かを判定するルーチンを用意してやれば良い。 で、質問文の短いプログラムでは、mapはMap型の変数なんだけど、そこに実際に入っているインスタンスがTreeMapだときちんと並び替えをしてくれるのでMapインタフェースとTreeMapクラスでも良いのだ(mapをSortedMapインタフェースの変数に変える必要はない)。

nakisan2011_12
質問者

お礼

ありがとうございました。 TreeMapにして再チャレンジしてみようと思います。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1620/5655)
回答No.1

なぜHashMap? TreeMapではだめなの?

nakisan2011_12
質問者

お礼

TreeMAPに変更してやってみることにしました!ありがとうございました。

関連するQ&A

  • 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
  • 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
  • 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がおかしい

    HashMap で以下の様にコーディングしました。 当然 map の中には19個のオブジェクトが存在するはずですが、何故か15個しかありません。どなたか原因を御存知でしょうか? HashMap map = new HashMap(); map.put("key1", new Integer(1)); . (2->8)省略 . map.put("key9", new Integer(9)); map.put("key10", new String("10")); . (11->18)省略 . map.put("key19", new String("19")); 以下エクリプスのデバッガで取得したもの。 ECLIPSE 2.1.3 / JDK 1.4.2.03 map= HashMap (id=21) entrySet= HashMap$EntrySet (id=50) keySet= null loadFactor= 0.75 modCount= 19 size= 19 table= HashMap$Entry[32] (id=26) [0]= null [1]= HashMap$Entry (id=28) [2]= HashMap$Entry (id=31) [3]= null [4]= null [5]= null [6]= null [7]= null [8]= null [9]= HashMap$Entry (id=32) [10]= HashMap$Entry (id=33) [11]= null [12]= null [13]= HashMap$Entry (id=34) [14]= HashMap$Entry (id=35) [15]= HashMap$Entry (id=36) [16]= HashMap$Entry (id=37) [17]= null [18]= null [19]= null [20]= HashMap$Entry (id=38) [21]= null [22]= null [23]= HashMap$Entry (id=39) [24]= HashMap$Entry (id=40) [25]= null [26]= HashMap$Entry (id=41) [27]= HashMap$Entry (id=42) [28]= null [29]= HashMap$Entry (id=43) [30]= HashMap$Entry (id=44) [31]= null threshold= 24 values= null

    • ベストアンサー
    • Java
  • javaの連想配列について教えてください

    お世話になります。 javaの連想配列について教えてください。 やりたいことは下記のようなデータを作成したいです。 ================================================ {   "shcool" : {          "class" : "A",          "yamada" : {                "class" : "AA",                "height" : 165,                "weight" : 60         },          "saitou" : {                "class" : "AB",                "height" : 170,                "weight" : 65         }   } } ================================================ 下記HPを参考してHashMap+HashMapで作成したのですがうまくいきません。 http://www.atmarkit.co.jp/fjava/javatips/081java010.html Map<String, Object> map = new HashMap<String, Object>(); map.put("school", new HashMap<String, Object>()); ((Map) map.get("school")).put("class", "A"); ((Map) map.get("school")).put("yamada", new HashMap<String, Object>()); ((Map) map.get("school")).get("yamada").put("class", "AB"); ・・・ としても下記エラーとなってしまいます。 ----------------------------------------------------- エラー: シンボルを見つけられません ((Map) map.get("school")).get("yamada").put("class", "AB");                            ^ シンボル: メソッド put(String,String) ----------------------------------------------------- 途中のschoolのvalueにHashMapを入れるところまではうまくいっているようですが、 yamadaのvalueにHashMapを入れて.put()の仕方がわかりません。。。 上記データをHashMap+HashMapで作成するにはどうしたらよいでしょうか? ぜひご教示いただけると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • MAPの配列・・・???!!!

    Mapというものを使うのが初めてなのですが、 よくわからなくなってしまいました。 他のプログラムから、 「MAPの配列で返ってくる」 のですが、このMAPの配列をintひとつ、ストリング2つから 作ろうとしているのですが、できずに困っています。 map[0]=("abc","ABC") map[1]=("def","DEF") map[2]=("ghi","GHI") ・ ・ みたいなイメージなのですが、エラーになります・・・ Map[] hairetu = new HashMap(); これでコンパイルできません。 HelloWorldMap.java:17: 互換性のない型 出現: java.util.HashMap 要求: java.util.Map[] Map[] hairetu = new HashMap(); Map[] hairetu; という宣言だけならできます。 受け渡し先でMapの配列を要求しているのでこのような形が必要なのですが・・・ ちなみにソースを見ると hairetu[i].get(キー) みたいなとり方をしています。

    • ベストアンサー
    • Java
  • android CSVファイルのデータを

    初心者ですが宜しくお願いします。 やりたい処理えですが、CSVファイルのデータをHashMapにセットしたいのです。 現在は下記のように直接値をセットしています。 この値をCSVからセットするにはどうすればよいでしょうか? HashMap<String, String> map = new HashMap<String, String>(); // キーと値のペアを格納 map.put( "Key1", "あ1001" ); map.put( "key2", "い1002" ); map.put( "Key3", "う1003" ); map.put( "key4", "え1004" ); map.put( "key5", "err" ); ------------------------------------ value.csv "key2", "い1002" "Key3", "う1003" "key4", "え1004" "key5", "err" ------------------------------------ 上記csvファイルを作り、読み込むところまではわかります。 ヒント、参考サイトや参考書の情報でもかまいません。 どうぞよろしくおねがいいたします。

    • ベストアンサー
    • Java
  • Map<T, ArrayList<T>>にput

    Map<String, ArrayList<Long>> map = new HashMap<String, ArrayList<Long>>(); と宣言された map に put()する方法を教えて下さい。言語はJavaです。 mapの値がArrayListのため、map.put("key", 10L);のように直接代入することができません。 解決策を教えて下さい。 ※質問のタイトルは字数制限のため、変なタイトルになっています。

    • ベストアンサー
    • Java
  • 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
  • HashMapについて

    質問させてください 以下に簡単なコードをJBuilderで作成しました。 printでブレークをはってmapインスタンスを評価してみると、mapに20個のキーが登録されるはずが、 16個しかいません。 この時点でstr1[16]が評価しても表示されていないのですが、map.get()で正常に取得はできています。 どのようなことが考えられるか、わかる型がいましたら教えてください。よろしくお願いいたします。 import java.util.*; class Test { public static void main(String[]args){ HashMap map = new HashMap(); String str1[] = new String[20]; String str2[] = new String[20]; for(int i = 0; i < 20; i ++){ str1[i] = new String(Integer.toString(i)); str2[i] = new String(Integer.toString(i * 10)); map.put(str1[i],str2[i]); } System.out.println("デバック用ブレーク"); System.out.println(map.get(str1[11])); } }

    • ベストアンサー
    • Java

専門家に質問してみよう