Сортировка хеш-карты по ключам


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

Отличное решение! Есть одна проблема с 2-значными номерами, сортировка становится 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- ваш лучший выбор для такой сортировки (естественная). TreeMapестественно сортирует по ключам.

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


5

Используйте TreeMap , хотя наличие карты, «похожей на эту», немного туманно - вы также можете просто отсортировать ключи на основе ваших критериев и перебирать карту, извлекая каждый объект.


3

Просто используйте 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);

Реализация интерфейса карты:

  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.