Сортировка списка строк для отображения первых строк с определенной подстрокой, а затем оставшихся строк в их отсортированном порядке - PullRequest
0 голосов
/ 21 января 2020

У меня есть список строк (com.ab c .c345, com.ab c .a123, com.ab c .d456, com.ab c .b234, com.qwr. a1, com.wer.b2, com.ert.c3)

Я хочу отсортировать это так, чтобы строки, содержащие 'com.ab c', отображались сначала в их отсортированном стиле, а после этого остальные строки в их отсортированном стиле.

Таким образом, вывод должен выглядеть примерно так:

(com.ab c .a123, com.ab c .b234, com.ab c .c345, com.ab c .d456, com.ert.c3, com.qwr.a1, com.wer.b2)

Редактировать 1: я пытался использовать компараторы как:

    Collections.sort(list, new Comparator<LoggerDetails>() {
        @Override
        public int compare(LoggerDetails o1, LoggerDetails o2) {
            if (o1.logger.startsWith("com.abc") && o2.logger.startsWith("com.abc")) {
                return o1.logger.compareTo(o2.logger);
            }
            if (o1.logger.startsWith("com.abc") && !o2.logger.startsWith("com.abc")) {
                return -1;
            }
            if (o1.logger.startsWith("com.abc") && !o2.logger.startsWith("com.abc")) {
                return 1;
            }
            return 0;
        }
    });

Ответы [ 3 ]

2 голосов
/ 21 января 2020

Вы достаточно близки: используйте свой компаратор, который выполняет упорядочение по первому критерию, затем соедините его с естественным компаратором упорядочения:

Collections.sort(list, new Comparator<LoggerDetails>() {
    @Override
    public int compare(LoggerDetails o1, LoggerDetails o2) {
        if(o1.logger.startsWith("com.abc") && !o1.logger.startsWith("com.abc")) {
            return -1;
        }
        if (o1.logger.startsWith("com.abc") && !o1.logger.startsWith("com.abc")) {
            return -1;
        } -- I just copypasted your original code, this should definitely be vice versa
        return 0;
    }  
}.thenComparing(o -> o.logger, Comparator.naturalOrder()));

Вы можете сделать свой компаратор более сжатым, используя факт, чем булевы значения. сравнимо:

comparing(o -> o.logger.startsWith("com.abc"), Comparator.reverseOrder())

Или, если у вас больше таких «исключительных» строк (как я заметил, вы продолжаете редактировать оригинальный пост), сопоставьте их с числами.

0 голосов
/ 21 января 2020

Вы можете просто отсортировать список, используя Collections.sort, предоставленный в пакете утилит в java. Ваш желаемый вывод представляется в алфавитном и числовом формате, чтобы это работало. Вот пример кода, который работал для меня:

    List<String> list = new ArrayList<>();
    list.add("com.abc.c345");
    list.add("com.abc.a123");
    list.add("com.abc.d456");
    list.add("com.abc.b234");
    list.add("com.qwr.a1");
    list.add("com.wer.b2");
    list.add("com.ert.c3");

    Collections.sort(list);
    list.forEach(value -> System.out.println(value));

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

0 голосов
/ 21 января 2020

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

, после этого вы можете просто добавить элементы нового списка, используя list.addAll (0, newList)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...