Поиск по сайту:

Как отсортировать HashMap по значению в Java?


HashMap в java обеспечивает быстрый поиск. Они хранят элементы в парах «ключ-значение». Чтобы получить значение из HashMap, мы используем ключ, соответствующий этой записи.

HashMaps — хороший метод для реализации словарей и каталогов.

Ключ и значение могут быть разных типов (например, String, Integer).

Мы можем сортировать записи в HashMap как по ключам, так и по значениям.

В этом уроке мы отсортируем HashMap по значению.

Основная стратегия состоит в том, чтобы получить значения из HashMap в виде списка и отсортировать список. Здесь, если тип данных Value — String, мы сортируем список с помощью компаратора. Чтобы узнать больше о компараторе, прочитайте этот учебник.

Когда у нас есть отсортированный список значений, мы снова создаем HashMap на основе этого нового списка.

Давайте посмотрим на код.

Сортировка HashMap по значению Простой пример

Сначала мы получаем значения String в списке. Затем сортируем список.

Для сортировки строковых значений в списке мы используем компаратор. Этот компаратор сортирует список значений в алфавитном порядке.

 Collections.sort(list, new Comparator<String>() {
            public int compare(String str, String str1) {
                return (str).compareTo(str1);
            }
        });

После того, как мы отсортировали список, мы создаем HashMap на основе этого отсортированного списка.

Полный код выглядит следующим образом:

package com.journaldev.collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;


public class Main {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        LinkedHashMap<String, String> sortedMap = new LinkedHashMap<>();
        ArrayList<String> list = new ArrayList<>();
        map.put("2", "B");
        map.put("8", "A");
        map.put("4", "D");
        map.put("7", "F");
        map.put("6", "W");
        map.put("19", "J");
        map.put("1", "Z");
        for (Map.Entry<String, String> entry : map.entrySet()) {
            list.add(entry.getValue());
        }
        Collections.sort(list, new Comparator<String>() {
            public int compare(String str, String str1) {
                return (str).compareTo(str1);
            }
        });
        for (String str : list) {
            for (Entry<String, String> entry : map.entrySet()) {
                if (entry.getValue().equals(str)) {
                    sortedMap.put(entry.getKey(), str);
                }
            }
        }
        System.out.println(sortedMap);
    }
}

Выход :

{8=A, 5=B, 3=D, 7=F, 10=J, 2=W, 1=Z}

Записи HashMap сортируются в соответствии со строковым значением.

Другой пример сортировки HashMap по значению

Если значения в HashMap имеют тип Integer, код будет следующим:

package com.JournalDev;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;


public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>();
        ArrayList<Integer> list = new ArrayList<>();
        map.put("A", 5);
        map.put("B", 7);
        map.put("C", 3);
        map.put("D", 1);
        map.put("E", 2);
        map.put("F", 8);
        map.put("G", 4);
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            list.add(entry.getValue());
        }
        Collections.sort(list); 
        for (int num : list) {
            for (Entry<String, Integer> entry : map.entrySet()) {
                if (entry.getValue().equals(num)) {
                    sortedMap.put(entry.getKey(), num);
                }
            }
        }
        System.out.println(sortedMap);
    }
}

Выход :

{D=1, E=2, C=3, G=4, A=5, B=7, F=8}

Здесь значения HashMap отсортированы по целочисленным значениям.

Сортировка HashMap с помощью пользовательского компаратора

Если вы заметили приведенные выше примеры, объекты Value реализуют интерфейс Comparator. Давайте рассмотрим пример, где наше значение является пользовательским объектом.

Мы также можем создать собственный компаратор для сортировки хеш-карты по значениям. Это полезно, когда ваше значение является настраиваемым объектом.

Давайте возьмем пример, где значение — это класс с именем «Имя». Этот класс имеет два параметра: firstName и lastName.

Код для имени класса:

package com.JournalDev;

public class Name {
   String firstName;
   String lastName;
   Name(String a, String b){
       firstName=a;
       lastName=b;

   }
    public String getFirstName() {
        return firstName;
    }


}

Пользовательский компаратор будет выглядеть так:

Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());

Мы сортируем имена по firstName, мы также можем использовать lastName для сортировки. Вместо использования списка для получения значений из карты мы будем использовать LinkedHashMap для непосредственного создания отсортированной хэш-карты.

Полный код:

public static void main(String[] args) {
        HashMap<Integer, Name> hmap = new HashMap<Integer, Name>();
        Name name1 = new Name("Jayant", "Verma");
        Name name2 = new Name("Ajay", "Gupta");
        Name name3 = new Name("Mohan", "Sharma");
        Name name4 = new Name("Rahul", "Dev");


        hmap.put(9, name1);
        hmap.put(1, name2);
        hmap.put(6, name3);
        hmap.put(55, name4);

        Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());

        LinkedHashMap<Integer, Name> sortedMap = hmap.entrySet().stream()
                .sorted(Map.Entry.<Integer, Name>comparingByValue(byName))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        
//printing the sorted hashmap 
        Set set = sortedMap.entrySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry me2 = (Map.Entry) iterator.next();
            System.out.print(me2.getKey() + ": ");
         System.out.println(hmap.get(me2.getKey()).firstName + " "+hmap.get(me2.getKey()).lastName );
          
        }
    }

Выход :

1: Ajay Gupta
9: Jayant Verma
6: Mohan Sharma
55: Rahul Dev

Заключение

В этом руководстве рассматривается сортировка HashMap по значению. Сортировка строковых значений отличается от целочисленных значений. Строковые значения требуют компаратора для сортировки. Принимая во внимание, что значения Integer напрямую сортируются с помощью Collection.sort().