我在对字符串数组[]进行排序时遇到了问题,根据哪个字符串中最多包含字母'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]);
[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())
,尽管老式的计数循环会更好)