23

私はこれを数時間試していますが、逆の順序でハッシュマップの反復を達成するための最良のアプローチを見つけていません。これは私が持っているハッシュマップです。

      Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();

             for(Integer key : map.keySet()) {
                List<String> value = map.get(key);
                List<Map<String,?>> security = new LinkedList<Map<String,?>>();  
                for(int ixy = 0; ixy < value.size()-1; ixy++){
                    security.add(createItem(value.get(ixy), value.get(ixy+1))); 
                }
                adapter.addSection(Integer.toString(key), new SimpleAdapter(getApplicationContext(), security, R.layout.list_complex, new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));  
            }

TreeMapの例も見ましたが、

             Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(map);

しかし、ツリーマップも昇順で表示されます。私が欲しいのは降順です。

4

12 に答える 12

49

逆順でハッシュマップの反復を達成するための最良のアプローチ

HashMapその要素の特定の順序を定義しません。したがって、「逆」の順序も定義されていません。

の場合はTreeMap、を使用できますdescendingMap()

于 2012-05-15T07:33:39.497 に答える
24

ハッシュマップには特定の順序はありません。ただし、TreeMapは使用できます。

おそらく、この簡単な例があなたを助けることができます:

Map<Integer, String> map = new TreeMap<Integer, String>();
        map.put(1, "abc1");
        map.put(2, "abc2");
        map.put(3, "abc3");

        ArrayList<Integer> keys = new ArrayList<Integer>(map.keySet());
        for(int i=keys.size()-1; i>=0;i--){
            System.out.println(map.get(keys.get(i)));
        }
于 2012-05-15T07:43:38.337 に答える
14

HashMapは、キー間のeny順序を維持しません。

TreeMapは、その自然な順序、またはマップの作成時に渡すコンパレーターによって課される順序によってキーを並べ替えます。したがって、整数キーを逆の順序で並べ替える場合は、次のようにTreeMapを作成します。

Map<Integer, List<String>> sortedMap = 
    new TreeMap<Integer, List<String>>(Collections.reverseOrder());
于 2012-05-15T07:35:47.910 に答える
6
Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(Collections.reverseOrder());

Collections.reverseOrder() keeps the map sorted in descending order.
于 2012-05-15T07:39:30.267 に答える
6

メソッドを使用できますTreeMap#descendingKeySet

Map<Integer, List<String>> map = new TreeMap<Integer, List<String>>();

for(Integer key : map.descendingKeySet()) {
    List<String> value = map.get(key);
    List<Map<String,?>> security = new LinkedList<Map<String,?>>();  
    for(int ixy = 0; ixy < value.size()-1; ixy++){
        security.add(createItem(value.get(ixy), value.get(ixy+1))); 
    }
    adapter.addSection(Integer.toString(key), new SimpleAdapter(getApplicationContext(), security, R.layout.list_complex, new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));
} 

参照

https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html#descendingKeySet--

于 2012-05-15T08:00:44.393 に答える
4

このHashMapため、逆に繰り返すことはできません:

このクラスは、マップの順序を保証するものではありません。特に、順序が時間の経過とともに一定に保たれることを保証するものではありません。

使用する必要があるのはLinkedHashMapです。

この実装は、すべてのエントリを介して実行される二重リンクリストを維持するという点でHashMapとは異なります。このリンクリストは、反復順序を定義します。これは通常、キーがマップに挿入された順序(挿入順序)です。キーがマップに再挿入されても、挿入順序は影響を受けないことに注意してください。(m.containsKey(k)が呼び出しの直前にtrueを返すときに、m.put(k、v)が呼び出された場合、キーkはマップmに再挿入されます。)

于 2012-05-15T07:34:58.927 に答える
4

ハッシュマップは順序付けられたコレクションではありません。代わりにTreeMapを使用してください。これには、逆反復用のdescendingKeySetがあります。javadocsを参照してください。LinkedHashMapも良い選択です。

于 2012-05-15T07:35:51.540 に答える
3
    TreeMap<Integer, String> map = new TreeMap<Integer, String>();
    map.put(1, "abc1");
    map.put(2, "abc2");
    map.put(3, "abc3");
    NavigableMap<Integer, String> nmap = map.descendingMap();
    for (NavigableMap.Entry<Integer, String> entry : nmap.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
    }

NPEアイデアの実装。

于 2016-11-23T17:38:46.543 に答える
2

おそらく、TreeMapのようなNavigableMapが必要です。

于 2012-05-15T07:35:07.613 に答える
2

しかし、ツリーマップも降順で表示されます。私が欲しいのは降順です。

Comparator自然な順序とは逆に比較するを実装し、通常どおりに反復すると、逆の反復が発生します

于 2012-05-15T07:39:34.510 に答える
2

instedを使用します:

new TreeMap<>(Collections.reverseOrder())

そして、あなたはあなたが望むものを手に入れるでしょう。

于 2017-03-18T12:14:38.590 に答える
0

Java HashtableからHashtable.values()。iterator()とHashtable.keys()。asIterator()を介して取得したイテレーターは、どちらもデフォルトで逆の順序になっていることがわかりました。奇妙なことに、values()。iteratorの最初の最終値は「0」ですが、これを入力するときに追加しませんでした。

于 2020-05-02T14:09:55.160 に答える