将字母出现与比较器进行比较

时间:2020-02-10 11:03:02

标签: sorting java-8 java-stream comparator

我在对字符串数组[]进行排序时遇到问题,根据哪个字符串中包含最多字母'p',即s1 (apple)将在s2 (ape)...之前

我正在学习如何实现Comparator并使用s1.compareTo(s2)和lambda。最大的问题是,我不能以某种方式使用流来执行此操作吗?

这是我对我的String数组COUNTRIES进行反向字母排序的方式

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 :(得分:1)

Yoo̶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 - da - 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()),尽管老式的计数循环会更好

相关问题