Сортировка List<String> по числам

120
07 февраля 2021, 13:30

Подскажите пожалуйста, вот есть список в

List<String> list

из таких элементов: n1007, n1001, n6751, n4420, n3347, n9044, n2046.

Как отсортировать элементы этого списка в порядке возрастания по числам, чтобы получилось: n1001, n1007, n2046, n3347, n4420, n6751, n9044?

Answer 1

Я бы предложил своим компаратором воспользоваться. Варианта 2: или оставаться на стрингах

List<String> list = Arrays.asList("n1000", "n110");
Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        // если строки разной длины, то более короткое
        // точно меньше, что можно получить сравнением длин
        if (o1.length() != o2.length())
            return Integer.compare(o1.length(), o2.length());
        else
            //если длины равны - сравниваем просто как строки
            return o1.compareTo(o2);
    }
};
Collections.sort(list, comparator);

Или парсить в инты/лонги

List<String> list = Arrays.asList("n1000", "n110");
Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        //откусываем в o1.substring(1) букву n, парсим число в Long  и сравниваем лонги
        return Long.compare(Long.parseLong(o1.substring(1)), Long.parseLong(o2.substring(1)));
    }
};
Collections.sort(list, comparator);

Что будет быстрее сложно сказать, но я ставлю на первый вариант

Answer 2
list.stream()
            .sorted(Comparator.comparingInt(s -> Integer.valueOf(s.substring(1))))
            .forEach(System.out::println);
Answer 3

Для сортировки коллекций можно использовать метод Collections.sort(List,Comparator). В качестве компаратора в данном случае подойдет String.CASE_INSENSITIVE_ORDER:

List<String> list =
        Arrays.asList("n1007", "n1001", "n6751",
                "n4420", "n3347", "n9044", "n2046");
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
System.out.println(list); // [n1001, n1007, n2046, n3347, n4420, n6751, n9044]

В 8 версии Java появился метод List.sort:

list.sort(String.CASE_INSENSITIVE_ORDER);
READ ALSO
Не понимаю как создать ссылку на следующий handler, которые лежать в списке handlers

Не понимаю как создать ссылку на следующий handler, которые лежать в списке handlers

У меня учебный проект на Spring MVC и я пытаюсь применить паттерн Chain of responsibilityСоздал пакет handler в котором есть интерфейс Handler

112
Типизация объектов

Типизация объектов

У меня есть класс AppealTemlate, который содержит список сущностей extends AbstractFieldВыглядит это примерно так:

120