Integer.compareTo численно сортирует числа. Это то, что вы хотите.
String.compareTo сортирует строки лексикографически; в алфавитном порядке.
Я помню в Windows 3.1, что папка с фотографиями с моей цифровой камеры была упорядочена следующим образом: ФОТО1, ФОТО10, ФОТО100, ФОТО2, ФОТО20, ФОТО3, ... и так далее. Windows XP сортирует их больше, чем вы ожидаете: PHOTO1, PHOTO2, PHOTO3, ... и т. Д. Это потому, что в ней есть специальные правила сортировки для строк, представляющих числа.
В лексикографическом порядке каждый символ в одной строке A сравнивается с соответствующим символом в другой строке B. Для каждого соответствующего символа в двух строках:
- Если текущий символ A лексикографически меньше (предшествует в алфавите) символа B, то A предшествует B.
- Если символ B меньше, чем персонаж A, то B предшествует A.
- Если два символа одинаковы, то мы пока не знаем. Следующий проверен.
- Если в одной из строк больше не осталось символов, то более короткий предшествует более длинному.
- Если в обеих строках больше не осталось символов, значит, это одна и та же строка.
Четвертый пункт здесь - почему вы получаете неправильные ответы, предполагая, что анализ вашей проблемы Эдди правильно.
Рассмотрим строки «10» и «2». Лексикографический порядок будет выглядеть по первым буквам каждого, «1» и «2» соответственно. Символ «1» стоит перед «2» в наборе символов, который используется Java, поэтому он сортирует «10» перед «2», так же, как «голый» сортируется перед «зайцем», потому что «b» предшествует » ч.
Я предлагаю вам привести ваши строки к целым числам перед сортировкой. Для этого используйте Integer.parseString.