У меня есть следующий код:
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 () работает с настраиваемым компаратором?