Сортировка Map
Имеется следующий код.
Map<Integer, String[]> hashMap = new HashMap<>();
hashMap.put(1, new String[] {"числа1" , "7", "8", "3"});
hashMap.put(2, new String[] {"числа2" , "4", "1", "4"});
hashMap.put(3, new String[] {"числа3" , "2", "4", "1"});
hashMap.put(4, new String[] {"числа4" , "1", "6", "5"});
hashMap.put(4, new String[] {"числа5" , "1", "6", "2"});
Как его отсортировать мапу по убыванию, по последнему значению в массиве String[], и вывести в консоль? Вывод в консоль в этом примере должен получится такой
числа4 , 1, 6, 5
числа2 , 4, 1, 4
числа1 , 7, 8, 3
числа5 , 1, 6, 2
числа3 , 2, 4, 1
Т.е. сортировка производилась именно по последнему элементу внутри массива string[].
Ответы (1 шт):
Автор решения: Дмитрий
→ Ссылка
Например, так:
Map<Integer, String[]> collect = hashMap.entrySet().stream()
.sorted((e1, e2) -> {
final String s1 = e1.getValue()[e1.getValue().length-1];
final String s2 = e2.getValue()[e2.getValue().length-1];
return s2.compareTo(s1);
})
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (o1, o2) -> o1, LinkedHashMap::new));
Но проблема в том, что у вас числа записаны как переменные типа String, поэтому сортировка будет производится именно для этих переменных и она не соответсвует сортировке для чисел. Если необходимо сортировать по последнему значению массива, воспринимая это значение именно как число, а не как строчную переменную, то сделайте так:
Map<Integer, String[]> collect1 = hashMap.entrySet().stream()
.sorted((e1, e2) -> {
final Integer s1 = Integer.valueOf(e1.getValue()[e1.getValue().length-1]);
final Integer s2 = Integer.valueOf(e2.getValue()[e2.getValue().length-1]);
return s2.compareTo(s1);
})
.limit(10)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (o1, o2) -> o1, LinkedHashMap::new));