Сортировка Java ArrayList с буквами перед номерами

В настоящее время я перехожу в ArrayList для заполнения заголовков TabLayout на Android. Элементами массива являются строки: ["RCP", "RYL", "1", "2", "3", "4", "5", "6"]. Тем не менее, не обязательно в таком порядке.

Я бы хотел, чтобы список возвращался с элементами Letter сначала (в алфавитном порядке), а затем целые числа возрастали, постепенно.

Я попытался использовать метод Collections.sort , но он возвращает список, который численно увеличивается, а затем добавляет строки «R» последним: ["1", "2", "3", "4", "5", "6", "RCP", "RYL"]

Чтобы уточнить, я хотел бы отсортировать мой ArrayList, чтобы он возвращал ["RCP", "RYL", "1", "2", "3", "4", "5", "6"] Он также Должен быть гибким, поскольку названия строк «R», вероятно, изменятся.

благодаря

Если вы хотите отдать приоритет строкам, которые представляют числа по строкам, которые этого не делают, вы должны подумать о написании своего собственного Comparator и передать его методу Collections.sort .

Это простой подход к вашей проблеме: проверьте, является ли какая-либо строка числом, если да, укажите приоритет для строки, которая не является числом. Если оба являются числами или строками, используйте метод compareTo .

Надеюсь, поможет.

 public class Main { private static int customCompare(String a, String b) { return isThereAnyNumber(a, b) ? isNumber(a) ? 1 : -1 : a.compareTo(b); } private static boolean isThereAnyNumber(String a, String b) { return isNumber(a) || isNumber(b); } private static boolean isNumber(String s) { return s.matches("[-+]?\\d*\\.?\\d+"); } public static void main(String[] args) { List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); Collections.sort(list, Main::customCompare); System.out.println(list); } } 

ОБНОВИТЬ

Вы можете использовать анонимный внутренний класс, который реализует интерфейс Comparator если вы не используете Java 8.

 public class Main { public static void main(String[] args) { List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); Collections.sort(list, new Comparator<String>() { private boolean isThereAnyNumber(String a, String b) { return isNumber(a) || isNumber(b); } private boolean isNumber(String s) { return s.matches("[-+]?\\d*\\.?\\d+"); } @Override public int compare(String a, String b) { return isThereAnyNumber(a, b) ? isNumber(a) ? 1 : -1 : a.compareTo(b); } }); System.out.println(list); } } 

Существует перегрузка для Collections.sort которая будет принимать в Comparator , что позволит вам определить порядок сортировки для ваших товаров. В этом случае все, что вам нужно сделать, это определить собственную реализацию интерфейса Comparator которая работает по вашему усмотрению.