Сравнение вхождения букв с компаратором - PullRequest
0 голосов
/ 10 февраля 2020

У меня проблема с сортировкой массива строк [], в зависимости от того, в каких строках больше всего букв "p", т. Е. s1 (apple) было бы до s2 (ape)...

. реализовать Comparator, чтобы сделать это и использовать затем s1.compareTo (s2) и лямбда-выражения. Большой вопрос, не могу ли я как-то использовать поток, чтобы сделать это?

Вот как я это сделал для моего СТРОГО массива СТРАНЫ в обратном алфавите c сортировка

Comparator<String> reverseAlphabetic = (s1,s2) -> -s1.compareToIgnoreCase(s2);   

Arrays.sort(COUNTRIES,reverseAlphabetic);
System.out.println("\nCountries in reverse alphabetic order");
for (int i=0; i<10;i++)
    System.out.println("\t"+COUNTRIES[i]);

1 Ответ

0 голосов
/ 10 февраля 2020

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 будет еще лучше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...