Сортировка 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));
→ Ссылка