java - 按特定字符排序的列表(Java 8)
问题描述
我有以下列表:
List<String> fruits = new ArrayList<String>(Arrays.asList("Apple", "Banana", "Orange", "Watermelon", "Peach"));
我需要在这个条件下订购它:
- 首先,包含字符“o”或“O”的那些
- 然后,剩下的人。
结果应该是:
Orange, Watermelon, Apple, Banana, Peach
我怎样才能在 Java 8 中做到这一点?
解决方案
您可以使用比较器链。
List<String> fruits = new ArrayList<>(Arrays.asList(
"Apple", "Banana", "Orange", "Watermelon", "Peach"));
fruits.sort(Comparator.comparing((String s) -> !s.contains("O") && !s.contains("o"))
.thenComparing(Comparator.naturalOrder()));
System.out.println(fruits.stream().collect(Collectors.joining(", ")));
第一个比较器查看字符串是否包含一个 O 使那些先行的,第二个比较器使用自然排序。
注意:Boolean.TRUE.compareTo(Boolean.FALSE) > 0
所以要使包含 O 的字符串首先出现,我用 a 翻转它!
这打印
Orange, Watermelon, Apple, Banana, Peach
注意:在这种情况下,new ArrayList<>( ... )
不需要,因为sort
不会更改元素的数量,只需重新排列它们。
编辑:基于@Holger 的建议。
如果首选稳定排序,即尽可能保持顺序不变。
List<String> fruits = Arrays.asList(
"Watermelon", "Peach", "Orange", "Banana", "Apple");
fruits.sort(Comparator.comparing((String s) -> !s.contains("O") && !s.contains("o")));
System.out.println(fruits.stream().collect(Collectors.joining(", ")));
印刷
Watermelon, Orange, Peach, Banana, Apple
推荐阅读
- javascript - 如何在给定数组上使用方法之前省略检查数组长度?
- kubernetes - 无法获取我的 kubernetes 主节点的 externalID(即 aws 提供的 instanceId)
- recursion - 树的树的时间复杂度 [...]
- .net - 模型优先的方法,在 SQL 脚本中不生成属性的默认值
- python - Tkinter 以与扩展相同的方式缩小窗口以适应框架?
- python - 返回字典的 Python sorted() 函数 - 代码优化
- java - 如何使用可打印字符生成 32 位随机密码?
- julia - 在 Julia 中使用 PyPlot 时,我们如何删除绘图周围的框?
- javascript - Google Cloud Functions 和 AWS Lambda 的超时问题
- python - 代码中的列表索引超出范围错误