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

问题描述 投票:0回答:1

我在对字符串数组[]进行排序时遇到了问题,根据哪个字符串中最多包含字母'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]);
sorting java-8 java-stream comparator
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.