• ベストアンサー

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

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

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

  • ベストアンサー
  • newta777
  • ベストアンサー率58% (20/34)
回答No.2

TreeMapはキーの昇順に並べ替えるMapです。 登録順を保持するMapならば、LinkedHashMapを使えばできると思います。

gutiguti2010
質問者

お礼

ありがとうございます! TreeMapの箇所をLinkedHashMapに変更した所、すんなりうまくいきました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

あくまでMapを使うのですね。 最良の方法かどうかはわかりませんが、ぱっと思いつく限りでは 1.外部に順序を管理する ・TreeMapに要素を追加/更新するタイミングでArrayList、LinkedListあたりにkeyを削除/追加する。 ・読み出し時はそのListをぐるぐる回す。 2.キー自身に順序を持たせる ・Stringのkeyと時系列昇順のid(※)を持ち、id基準の自然順序付けを持つクラスを定義する。 ・equalsメソッド、hashCodeメソッドをkey基準の結果を返すように再定義する。 ・作成したクラスのインスタンスをTreeMapのkeyとして使用する。 ・読み出し時はkeySet().iterator()をぐるぐる回す。 ※クラス変数で採番した数値やSystem.nanoTime()の戻り値等。 等の方法がありそうです。 でも、もっと良いやり方がありそうな気がします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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
  • 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 二分探索木トラバーサルのコンパイル時警告

    下記の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変数に、あらかじめ値を入れておいて、

    例えば、以下のようなクラスでmap変数に、あらかじめ値を入れておいて、別のクラスで使うときに Common.map.get(""); と書いて、いつでも値を取り出したいのですが、static変数は、コンストラクタでいじれないようで出来ません。 このCommonクラス内であらかじめ値を入れておく方法はあるでしょうか? public class Common{ public static HashMap<String, String> map = new HashMap(); }

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

  • std::mapの要素を別のキーに移動したいのですがどうしたら良いでし

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

  • 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
  • データベース入門書

    入門書に以下のような説明がありましたが意味がわかりません。 ☆キーの存在というタイトルで (省略) 「キー自体が持つ機能は、ファイル編成によっても異なりますが、通常、キーを指定することで、レコードをキーの持つ値の順番に昇順、もしくは降順に並び替えたり、読み込んだりすることが可能です。」 (省略)... 「レコードをキーの持つ値の順番に昇順」のところが何を言ってるのかわかりません。 「レコードをキーの持つ値で順番に昇順」ならなんとなくわかるのですが・・・ 僕が単に理解していないからわかってないのでしょうか・・ ご助言よろしくお願いします。

  • 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