В данной статье мы рассмотрим способы сортировки структуры данных Map в Java по ключу (key) и по значению (value).
Сортировка по значению:
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class SortMapByValue {
public static void main(String[] args) {
Map<string, integer=""> initialMap = new HashMap<>();
initialMap.put("D", 10);
initialMap.put("I", 5);
initialMap.put("H", 6);
initialMap.put("C", 20);
initialMap.put("K", 1);
initialMap.put("G", 7);
initialMap.put("F", 8);
initialMap.put("A", 99);
initialMap.put("B", 50);
initialMap.put("J", 2);
initialMap.put("E", 9);
System.out.println("initialMap: " + initialMap);
Map<string, integer=""> sortedMap = sortMapByValue(initialMap);
System.out.println("sortedMap: " + sortedMap);
}
private static <k, v="" extends="" comparable<?="" super="">> Map<k, v=""> sortMapByValue(Map<k, v=""> initialMap) {
List<map.entry<k, v="">> list =
new LinkedList<>(initialMap.entrySet());
list.sort(Comparator.comparing(o -> (o.getValue())));
Map<k, v=""> result = new LinkedHashMap<>();
for (Map.Entry<k, v=""> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
}
</k,></k,></map.entry<k,></k,></k,></k,></string,></string,>
Вывод в консоль:
initialMap: {A=99, B=50, C=20, D=10, E=9, F=8, G=7, H=6, I=5, J=2, K=1}
sortedMap: {K=1, J=2, I=5, H=6, G=7, F=8, E=9, D=10, C=20, B=50, A=99}
В данном примере основные шаги в методе sortMapByValue это:
- Преобразование Map в список Map.
- Сортировка полученного списка с использованием нашего компаратора (сравнение значений)
- Проходимся циклом по списку и кладём элементы в новую Map.
Cортировка по ключу
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class SortMapByKey {
public static void main(String[] args) {
Map<Integer, String> initialMap = new HashMap<>();
initialMap.put(100, "Hundred");
initialMap.put(90, "Ninety");
initialMap.put(80, "Eighty");
initialMap.put(70, "Seventy");
initialMap.put(60, "Sixty");
initialMap.put(50, "Fifty");
initialMap.put(40, "Forty");
initialMap.put(30, "Thirty");
initialMap.put(20, "Twenty");
initialMap.put(10, "Ten");
initialMap.put(2, "Two");
initialMap.put(1, "One");
System.out.println("initialMap: " + initialMap);
Map<Integer, String> sortedMap = new TreeMap<>(initialMap);
System.out.println("sortedMap" + sortedMap);
}
}
Результат:
initialMap: {80=Eighty, 1=One, 50=Fifty, 2=Two, 100=Hundred, 20=Twenty, 70=Seventy, 40=Forty, 90=Ninety, 10=Ten, 60=Sixty, 30=Thirty}
sortedMap{1=One, 2=Two, 10=Ten, 20=Twenty, 30=Thirty, 40=Forty, 50=Fifty, 60=Sixty, 70=Seventy, 80=Eighty, 90=Ninety, 100=Hundred}
В данном случае, решение заключается в использовании устройства коллекции TreeMap, которая гарантирует, что элементы внутри будут отсортированы. Также, мы можем передать свой компаратор в эту коллекцию, для изменения логику сортировки.
На этом мы заканчиваем обзор сортировки Map в Java.