Сортировка Arraylist в индивидуальном порядке - PullRequest
0 голосов
/ 28 июня 2018

Спасибо, что уделили нам время :) 1001 *

У меня есть фрагмент кода, который сортирует Arraylist с использованием compareToIgnoreCase.

Collections.sort(als,new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            //I want to alter this part
            int dif=o1.compareToIgnoreCase(o2); 
            return dif;
        }


    });

Но я хочу отсортировать массив следующим образом:

ввод: (в любом порядке)

sherin
Sherin
SHERIN
bubBle
buBble
BUBBLE
heart
hEart
hEArt

вывод:

BUBBLE
buBble
bubBle
hEArt
hEart
heart
SHERIN
Sherin
sherin

Не могли бы вы помочь мне с этим? Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 28 июня 2018
    public int compare(String s1, String s2) {
        int n1 = s1.length();
        int n2 = s2.length();
        int min = Math.min(n1, n2);
        for (int i = 0; i < min; i++) {
            char c1 = s1.charAt(i);
            char c2 = s2.charAt(i);
            char u1 = Character.toUpperCase(c1);
            char u2 = Character.toUpperCase(c2);
            char l1 = Character.toLowerCase(c1);
            char l2 = Character.toLowerCase(c2);

            if (u1 != u2) {
                return u1 - u2;
            } else {
                if (l1 != l2) {
                    return l1 - l2;
                } else if (c1 != c2) {
                    return c1 - c2;
                }
            }
        }
        return n1 - n2;
    }
0 голосов
/ 28 июня 2018

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

Stream.of("sherin", "Sherin", "SHERIN", "bubBle", "buBble", "BUBBLE", "heart", "hEart", "hEArt")
    .sorted((s1, s2) -> {
        int tmp = s1.compareToIgnoreCase(s2); 
        return tmp == 0 ? 
            s1.compareTo(s2) //Compare equivalent values based on the case (upper case first)
            : tmp;
    }).forEach(System.out::println);

Компаратор, предоставленный для Stream.sorted, аналогичен вашей реализации, но использует лямбда-нотацию.

Результат:

BUBBLE
buBble
bubBle
hEArt
hEart
heart
SHERIN
Sherin
sherin

РЕДАКТИРОВАТЬ: Спасибо Joop Eggen за предложение использовать декоратор компаратора:

Comparator
    .comparing(Function.identity(), String::compareToIgnoreCase)
    .thenComparing(Function.identity(), String::compareTo);

Это немного чище для использования и дает тот же результат:

Stream.of("sherin", "Sherin", "SHERIN", "bubBle", "buBble", "BUBBLE", "heart", "hEart", "hEArt").sorted(
        Comparator
            .comparing(Function.identity(), String::compareToIgnoreCase)
            .thenComparing(Function.identity(), String::compareTo)
    ).forEach(System.out::println);

И короче, что я мог сделать с этим обозначением:

Comparator.comparing((String s) ->.toLowerCase()).thenComparing(Function.identity())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...