Работа sorted () в java потоках с использованием лямбда-выражения в качестве компаратора - PullRequest
0 голосов
/ 28 мая 2020

У меня есть следующий код:

        Stream.of("5", "1", "3", "4", "2", "6")
        .sorted((s1, s2) -> {
            System.out.printf("sort: %s; %s\n", s1, s2);
            return s1.compareTo(s2);
        })
        .forEach(s -> System.out.println("forEach: " + s));

, где я пытаюсь отсортировать данные элементы в произвольном порядке, определенном лямбда-выражением выше в коде. Код работает как положено. Никаких сюрпризов. Но мне любопытно, как sorted () работает с моей предоставленной лямбдой. Я помещаю оператор печати в sorted () и вижу следующий результат:

sort: 3; 1
sort: 3; 5
sort: 3; 1
sort: 4; 3
sort: 4; 5
sort: 2; 4
sort: 2; 3
sort: 2; 1
sort: 6; 3
sort: 6; 5
forEach: 1
forEach: 2
forEach: 3
forEach: 4
forEach: 5
forEach: 6

, и это не то, что я ожидал. Я вижу, что 3 и 1 сравниваются дважды. Зачем ? Я вижу, что 6 никогда не сравнивается с 1 2 и 4. Почему снова?

Я не могу вывести никакие logi c таким способом сравнения.

Провёл небольшое исследование и узнал, что sorted () внутренне использует сортировку слиянием. Для данной сортировки слиянием массивов потребуется 6 сравнений:

2  6
4  6
1  2
3  4
5  6

, но выше мы видим более 6 сравнений. Так что же происходит? Как в целом sort () работает с настраиваемым компаратором?

...