Как перебрать hashmap в обратном порядке в Java

Я пробую это в течение некоторого часа, но не найдя лучшего подхода для достижения итерации hashmap в обратном порядке, это hashmap, который у меня есть.

      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);

Но treemap также дает в порядке возрастания, что я хочу в порядке убывания.

Ответ 1

У Hashmap нет определенного порядка. Но вы можете использовать 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)));
        }

Ответ 2

лучший подход к успешной итерации хэш-карты в обратном порядке

HashMap не определяет какого-либо определенного порядка его элемента. Поэтому "обратный" порядок также не определен.

При a TreeMap вы можете использовать descendingMap().

Ответ 3

A HashMap не поддерживает порядок между ключами.

TreeMap заказывает свои ключи по их естественному порядку или по заказу, наложенному компаратором, который вы передаете при построении карты. Поэтому, если вы хотите, чтобы клавиши Integer упорядочены в обратном порядке, создайте TreeMap следующим образом:

Map<Integer, List<String>> sortedMap = 
    new TreeMap<Integer, List<String>>(Collections.reverseOrder());

Ответ 4

Map<Integer, List<String>> sortedMap = new TreeMap<Integer, List<String>>(Collections.reverseOrder());

Collections.reverseOrder() keeps the map sorted in descending order.

Ответ 5

Вы можете использовать метод 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--

Ответ 6

Вы не можете перебирать HashMap в обратном направлении из-за this:

Этот класс не дает никаких гарантий относительно порядка карты; в в частности, он не гарантирует, что порядок останется постоянным со временем.

Что вы должны использовать, это LinkedHashMap:

Эта реализация отличается от HashMap тем, что она поддерживает двусвязный список, проходящий через все его записи. Это связано list определяет порядок итераций, который обычно является порядком в какие ключи были вставлены в карту (порядок вставки). Обратите внимание, что порядок вставки не изменяется, если ключ повторно вставлен в карту. (Ключ k повторно вставлен в карту m, если m.put(k, v) вызывается, когда m.containsKey(k) вернет истину непосредственно перед вызов.)

Ответ 7

Хешмап не является упорядоченной коллекцией. Вместо этого используйте TreeMap, который имеет descendingKeySet для обратной итерации. См. javadocs. LinkedHashMap также является хорошим выбором.

Ответ 8

    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.

Ответ 9

Возможно, вам понадобится NavigableMap, например TreeMap.

Ответ 10

Но treemap также дает в asecding порядке, что я хочу в порядке убывания.

Внедрите Comparator, который будет сравнивать его с обратным, чем естественный порядок, а затем просто итеративно будет иметь обратную итерацию

Ответ 11

Использовать insted:

new TreeMap<>(Collections.reverseOrder())

и вы получите то, что хотите.