Y̶o̶u̶ ̶c̶a̶n̶ ̶d̶o̶ ̶s̶o̶m̶e̶t̶h̶i̶n̶g̶ ̶l̶i̶k̶e̶ ̶t̶h̶i̶s̶ ̶: ̶
Comparator<String> comparator = (str1, str2) ->
((str1.length() - str1.replaceAll("p", "").length()) -
(str2.length() - str2.replaceAll("p", "").length()));
List<String> list = Arrays.asList("ape", "apple", "appple");
list.sort(comparator);
На самом деле мое решение имело фундаментальные ошибки. @ Holger прокомментировал решение в моем удаленном ответе.
list.sort(Comparator
.comparingLong((String s) -> s.chars().filter(c -> c == 'p').count()).reversed());
прокомментировал @ Holger
Ваш первый вариант тоже не работает , поскольку a - b - c - d
не совпадает с a - b - (c - d)
. Он просто дает желаемый результат случайно; другой оригинальный порядок приведет к другим результатам. Еще одна причина не использовать минус, когда вы имеете в виду, например Integer.compare(…, …)
. Правильный и эффективный компаратор может быть таким же простым, как Comparator.comparingLong(s -> s.chars().filter(c -> c=='p').count())
(или иметь в большинстве случаев первое, Comparator.comparingLong((String s) -> s.chars().filter(c -> c=='p').count()).reversed())
, хотя старомодный подсчет l oop будет еще лучше