2010-11-21 6 views
6

私が最初にそれぞれの最後のために必要なのHashMapHashMapの最初の反復はどのくらいですか?

items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

を持っています。

"C", "3" 
"B", "2" 
"A", "1" 
+0

「Last」と「First」という用語は、時間を表すように見えます。 LastとFirstが意味論的であると仮定した回答のほとんどは(例えば、CはAより大きく、したがってLastです)。挿入時間の順序が必要で、キーに挿入タイムスタンプがない場合、OrderedMapsは役に立ちません。 – extraneon

+1

'HashMap'はその要素の順序を保証しません。特に、注文が時間の経過とともに一定であることを保証するものではありません。したがって、「HashMap」は、何らかの注文を維持しなければならない場合に必要なものではありません。 – barjak

答えて

4

編集:自分とマシューは、あなたの質問が意味するものとは明らかに異なる解釈をしています。あなたが挿入した逆順、またはキーの逆順を意味しますか?あなたはキーの順序を逆に意味場合

は、ここでそれを行う方法は次のとおりです。

はTreeMapのように、注文した地図を使用して、items.keySetを反復処理()。あなたのキー値の自然な順序によって

のTreeMapの種類、あなたは逆の順序でキーをソートするコンストラクタにコンパレータに渡す必要がありますので:

Map<String, String> items = new TreeMap<String, String>(new Comparator<String>() { 
    public int compare(String a, String b) { 
    return b.compareTo(a); 
    } 
}); 

items.put("A", "1"); 
items.put("B", "2"); 
items.put("C", "3"); 

for (String s: items.keySet()) { 
    System.out.println(s + " " + items.get(s)); 
} 
+3

このコードは同等です: '地図<文字列、文字列>のアイテム=新しいTreeMapを<文字列、文字列>(Collections.reverseOrder());' – barjak

+0

クールああ - のコンテキストにある – iftheshoefritz

1

HashMapのはどんな順序を保証するものではありません。 LinkedHashMapを使用すると、それは挿入によって注文されますが、それでもやり直すための便利な方法はまだありません。

items.entrySet()に電話することもできます。それはSet<Map.Entry>を返します。その後、セットのサイズを取得し、toArray()を呼び出してから、下降forループを実行します。

0

別の方法 - あなたの鍵のにSortedSetを作成します:

import java.util.*; 

class MyComparator implements Comparator<String> { 
    public int compare(String a, String b) { 
     return -a.compareTo(b); 
    } 

    public boolean equals(String a, String b) { 
     return a.equals(b); 
    } 
} 

public class test { 
    public static void main(String[] args) { 
     HashMap<String, String> items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

     TreeSet<String> ts = new TreeSet<String>(new MyComparator()); 
     ts.addAll(items.keySet()); 
     for(Iterator<String> i = ts.iterator(); i.hasNext();) { 
      String key = i.next(); 
      System.out.println("key: " + key + ", value: " + items.get(key)); 
     } 
    } 
} 

出力:

 
key: C, value: 3 
key: B, value: 2 
key: A, value: 1 
+0

前に最終前提とすることを見たことがなかったですキー、しかし私は彼が挿入時間を意味すると思う。挿入時間がキーにない場合、コンパレータはあなたを助けません。 – extraneon

+0

私は同意しません。私は挿入時間はそれと関係がないとは思わない。私は彼がHashMapが何らかの順序で反復可能であり、それを逆にしたいと思って間違ったと思う。彼が意味する命令はアルファベット順であると仮定しています。 – sje397

6

NavigableMapTreeMapNavigableMap)は、ナビゲーション機能を備えたSortedMapです。

NavigableMap#descendingMap()は、このマップに含まれるマッピングの逆順表示(コピーではありません)を返します。

例:

NavigableMap<String, String> items = new TreeMap<String, String>(); 
items.put("B", "2"); 
items.put("A", "1"); 
items.put("C", "3"); 

for (Map.Entry<String, String> e : items.entrySet()) { 
    System.out.println(e); 
} 
// gives 
// A=1 
// B=2 
// C=3 

for (Map.Entry<String, String> e : items.descendingMap().entrySet()) { 
    System.out.println(e); 
} 

// gives 
// C=3 
// B=2 
// A=1 

注:あなたがあなたのMapのキーの自然順序付けを気にしている場合、この答えは有効です。挿入注文やアクセス注文について気になる場合は、LinkedHashMapをご覧ください。

注2:あなたの質問では、HashMapを使用しました。 HashMapは、その要素の注文を保証しないことに注意してください。実際には、注文が時間の経過とともに一定に保たれることさえ保証されていません。詳細については、HashMapjavadocの最初の段落を参照してください。

+0

注文はキーセマンティクスに基づいています。しかし、私は質問が挿入時間についてだと思う。したがって、順序の基準(挿入時間)がキーの一部ではないため、逆順はあなたを助けません。 – extraneon

+0

私は事を明確にするためにメモを付けました – barjak

関連する問題