Comparator и метод compare

185
31 января 2020, 18:40

Помогите понять логику выполнения программы. У нас есть 3 массива стрингов, они записаны в ArrayList, я сортирую их по количеству элементов в листе. То чего я не могу понять: как происходит эта сортировка? Что здесь происходит?

Comparator<String[]> sortByLength = new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                return o1.length - o2.length;
            }
        };
public class T{
    public static void main(String[] args) {
        String[] array1 = {"мама", "мыла", "раму"};
        String[] array2 = {"я", "очень", "люблю", "java"};
        String[] array3 = {"мир", "труд", "май"};
        List<String[]> arrays = new ArrayList<>();
        arrays.add(array1);
        arrays.add(array2);
        arrays.add(array3);
        Comparator<String[]> sortByLength = new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                return o1.length - o2.length;
            }
        };
arrays.sort(sortByLength);
        for (String[] str : arrays) {
            System.out.println(Arrays.toString(str));
        }
    }
}
Answer 1

Сортировка у вас происходит тут arrays.sort(sortByLength);
arrays это у вас объект ArrayList у него есть метод sort которому для сортировки вы передаете объект реализующий интерфейс Comparator

В данный коде блока

Comparator<String[]> sortByLength = new Comparator<String[]>() {
    @Override
    public int compare(String[] o1, String[] o2) {
        return o1.length - o2.length;
    }
};

вы реализуете анонимный класс используя интерфейс Comparator у него есть метод compare который принимает два объекта и для сортировки возращяет.
0 : если объекты равны
-1 (не обязательно -1, должно быть любое отрицательное число) : если o1 < o2
1 (любое положительное число) : если o1 > o2

UDP. Это код старый. до Java 8. В Java 8 появились лямба функции которые дают более элегантный код, например так:

arrays.sort((o1, o2) -> o1.length - o2.length);
/// или 
arrays.sort(Comparator.comparingInt(o -> o.length));
Answer 2

Компаратор сравнивает текущее значение и следующее. То есть у вас сравненине будет примерно такое

{"я", "очень", "люблю", "java"} > {"мама", "мыла", "раму"} = 1
{"мир", "труд", "май"} < {"я", "очень", "люблю", "java"} = -1
{"мир", "труд", "май"} < {"я", "очень", "люблю", "java"} = 1
{"мама", "мыла", "раму"} < {"мир", "труд", "май"} = 0

На основании этих значений, компоратор поставит в порядке возрастания в зависимости от длины массива.

[мама, мыла, раму]
[мир, труд, май]
[я, очень, люблю, java]
READ ALSO
Экранировать вложенные кавычки на Java

Экранировать вложенные кавычки на Java

Уже долго мучаюсь над проблемойИмеются строки примерно такого формата: registrationNumber:""074-р"" registrationNumber:"074"-р" registrationNumber:""07"4-р"" После двоеточия...

176
Ширина блока по наибольшему

Ширина блока по наибольшему

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

185
JavaScript выдает ошибку Uncaught TypeError: Cannot read property &#39;innerHTML&#39; of undefined

JavaScript выдает ошибку Uncaught TypeError: Cannot read property 'innerHTML' of undefined

Ошибка говорит что нельзя присвоить текст к несуществующему объекту, что-то не так с получением данных

184