Подскажите пожалуйста, вот есть список в
List<String> list
из таких элементов: n1007, n1001, n6751, n4420, n3347, n9044, n2046.
Как отсортировать элементы этого списка в порядке возрастания по числам, чтобы получилось: n1001, n1007, n2046, n3347, n4420, n6751, n9044?
Я бы предложил своим компаратором воспользоваться. Варианта 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);
Что будет быстрее сложно сказать, но я ставлю на первый вариант
list.stream()
.sorted(Comparator.comparingInt(s -> Integer.valueOf(s.substring(1))))
.forEach(System.out::println);
Для сортировки коллекций можно использовать метод 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);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей