Сортування хеш-карти на основі ключів


79

У мене є така хеш-карта в Java:

{B046 = 0,0, A061 = 3,0, A071 = 0,0, B085 = 0,0, B075 = 3,0, B076 = 9,0, B086 = 3,0, B095 = 0,0, B096 = 0,0, A052 = 0,0, B066 = 0,0, B056 = 9,0, B065 = 0,0, B055 = 9,0}

Як слід сортувати хеш-карту таким чином, щоб були враховані алфавіт та цифри?

Отримана хеш-карта повинна виглядати так:

{A052 = 0,0, A061 = 3,0, A071 = 0,0, B046 = 0,0, B055 = 9,0, B056 = 9,0, B065 = 0,0, B066 = 0,0, B075 = 3,0, B076 = 9,0, B085 = 0,0, B086 = 3,0, B095 = 0,0, B096 = 0,0}

Цінуйте допомогу!


3
hashmap призначений для пошуку. Це хеш речі. Це не підтримує порядок.
Мухаммед Хасан Хан

2
@HasanKhan .. хто навіть це запитував?
eRaisedToX

Відповіді:


239

Використовуйте сортування TreeMap:

Map<String, Float> map = new TreeMap<>(yourMap);

Він автоматично помістить записи, відсортовані за ключами. Я думаю String, що у вашому випадку природне замовлення буде нормальним.

Зауважте, що HashMapзавдяки оптимізації пошуку не зберігається порядок.


Привіт @Tomasz Nurkiewicz Як я можу отримати зворотне замовлення?
Рагхавендра

Чи можу я застосувати власний компаратор
Fakher

Чудове рішення! Є одна проблема з двозначними номерами, сортування стає 1, 10, 11,12,2,3,4,5. Чи є якесь рішення для цього?
Рачіта Нанда

@RachitaNanda, Ви можете спробувати зберегти цифри з цілим числом, ніж рядок.
Крішна

27

Використовуйте TreeMap із користувацьким компаратором.

class MyComparator implements Comparator<String>
    {
        public int compare(String o1,String o2)
        {
            // Your logic for comparing the key strings
        }
    }

TreeMap<String, Float> tm = new TreeMap<String , Float>(new MyComparator());

По мірі додавання нових елементів вони автоматично сортуються.

У вашому випадку може навіть не знадобитися реалізація компаратора, оскільки порядок рядків може бути достатнім. Але якщо ви хочете застосувати особливі випадки, наприклад, букви нижнього регістру з’являються перед великими літерами, або обробляти цифри певним чином, використовуйте компаратор.


11

TreeMap- це найкращий вибір для такого сортування (Natural). TreeMapприродним чином сортує за клавішами.

HashMapне зберігає порядок вставки і не сортує карту. LinkedHashMapзберігає порядок вставки, але не сортує карту автоматично. Тільки TreeMapв Mapінтерфейсі сортується карта відповідно до природного порядку (цифри спочатку, алфавіт верхнього регістру другий, алфавіт нижнього регістру останній).


5

Використовуйте TreeMap , хоча мапа "виглядати так" трохи туманна - ви також можете просто сортувати ключі за вашими критеріями та перебирати карту, отримуючи кожен об'єкт.


3

Просто використовуйте a TreeMap. Він реалізує SortedMapінтерфейс і, таким чином, автоматично сортує містяться в ньому ключі. Ваші ключі можна просто відсортувати за алфавітом, щоб отримати бажаний результат, тому вам навіть не потрібно надавати компаратор.

HashMaps ніколи не сортуються. Єдине, що ви можете зробити з HashMap, це отримати всі ключі та зберегти їх у відсортованому наборі або у списку та відсортувати список.


3

За допомогою TreeMap ви можете сортувати карту.

Map<String, String> map = new HashMap<String, String>();        
Map<String, String> treeMap = new TreeMap<String, String>(map);
//show hashmap after the sort
for (String str : treeMap.keySet()) {
    System.out.println(str);
}

3

Ви можете використовувати, TreeMapякий буде зберігати значення у відсортованому вигляді.

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

2

Використовуйте TreeMap (конструктор):

Map<String, Float> sortedMap = new TreeMap<>(yourMap);

Використовуйте TreeMap (метод PutAll):

Map<String, Float> sortedMap = new TreeMap<>();
sortedMap.putAll(yourMap);

Впровадження інтерфейсу Map:

  1. TreeMap - Автоматично сортувати ключі за зростанням під час вставки.
  2. HashMap - Порядок вставки не зберігатиметься.
  3. LinkedHashMap - Порядок вставки буде збережено.

1

TreeMap автоматично сортуватиме за зростанням. Якщо ви хочете відсортувати за спаданням, використовуйте такий код:

Скопіюйте наведений нижче код у своєму класі та за межами основного методу виконання:

static class DescOrder implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {      
        return o2.compareTo(o1);
    }
    }

Тоді у вашій логіці:

TreeMap<String, String> map = new TreeMap<String, String>(new DescOrder());
map.put("A", "test1");
map.put("C", "test3");
map.put("E", "test5");
map.put("B", "test2");
map.put("D", "test4");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.