Приветствую! Столкнулся со странной проблемой. Описание и вопрос в коде:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test1825 {
public static void main(String[] args) {
// Есть несортированный массив строк, содержащих числовые окончания
// (для простоты оставил только сами числа)
// Хочу их вывести в порядке возрастания числа:
// 1, 2, 5, 6, 11, 15, 21, 25, 55
// Пробую сортировать:
String[] s = {"5", "2", "11", "1", "21", "55", "15", "25", "6"};
Arrays.sort(s);
System.out.println(Arrays.toString(s));
// Результат: [1, 11, 15, 2, 21, 25, 5, 55, 6]
// наверно, предсказуем, но пробую через коллекцию:
List<String > list = new ArrayList<>(Arrays.asList("5", "2", "11", "1", "21", "55", "15", "25", "6"));
list.sort(String::compareTo);
System.out.println(list);
// Результат тот же. Логично, ведь взят штатный компаратор от String.
// Хорошо! Пишу свой компаратор, учитывающий длину строки:
list = Arrays.asList("5", "2", "11", "1", "21", "55", "15", "25", "6");
list.sort((String a, String b) ->
{
//System.out.println(a + "| " + b + "|"); // контроль
int res = 0;
char[] arrA = a.toCharArray();
char[] arrB = b.toCharArray();
int end = Math.min(a.length(), b.length());
for (int i = 0; i < end; i++) {
res = arrA[i] - arrB[i];
if (res != 0) break;
}
if (res == 0) res = a.length() - b.length();
//System.out.println(res); // контроль
return res;
}
);
System.out.println(list);
// Если раскомментировать контрольный вывод: то видно что компаратор отрабатывает правильно,
// т.е. к примеру: 2 < 11
// НО! Результат всё тот же - неправильная сортировка.
// Как сие можно объяснить и как подобные строки сортировать правильно?
}
}
Подскажите что не так и как правильно :)