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

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}

Цените помощь!

user1008697
источник
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());

Когда вы добавляете новые элементы, они автоматически сортируются.

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

Kal
источник
11

TreeMap- ваш лучший выбор для такой сортировки (естественная). TreeMapестественно сортирует по ключам.

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

Рошнал
источник
5

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

Дэйв Ньютон
источник
3

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

HashMaps никогда не сортируются. Единственное, что вы можете сделать с HashMap, - это получить все ключи и сохранить их в отсортированном наборе или в списке и отсортировать список.

JB Nizet
источник
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 - порядок вставки будет сохранен.
Sangeeth
источник
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");
JavaGeek
источник