java - 按字符串长度降序对字符串列表进行排序,不会更改列表

标签 java list sorting collections

我想按字符串长度降序对 immutableList 的副本进行排序。我必须支持java 8以下的API。

我尝试了这个基本代码,但它仍然是相反的顺序

ImmutableList<String> possibleTexts = ImmutableList.of("aa", "bbbbbb");
final List<String> mutableList = new ArrayList<>(possibleTexts);
Collections.sort(mutableList, (s1, s2) -> Math.abs(s1.length() - s2.length()));

但是 mutableList 是 "aa", "bbbbbb" 而不是 "bbbbbb","aa"

最佳答案

您的输出与您期望的相反,因为 Math.abs(s1.length() - s2.length()) 对于两个 都返回 4 |2 - 6||6 - 2|

Collections#sort 的文档还指出以下内容:

This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort.

要解决您的问题,您可以删除 Math#abs并交换您的比较(String 的长度不能为负,因此不会发生上溢/下溢):

Collections.sort(mutableList, (s1, s2) -> s2.length() - s1.length());

但是,我建议使用 List#sortComparator#comparingIntComparator#reversed ,因为它比您当前的代码片段对我来说更具可读性。

关于java - 按字符串长度降序对字符串列表进行排序,不会更改列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62233723/

相关文章:

java - 使用 SwingWorker 和 HttpClient-4.1.1 在 Sun java 和 Oracle 之间上传奇怪的文件行为

list - 为什么我们有map、fmap和liftM?

c# - 如何从 List<string[]> 中获取所有可能的字符串组合?

python - 在 Python 中返回多维的最小值/最大值?

c - 将元素添加到排序列表

java - 如何传递整个 map

java - 用VFS实现 "Move"函数

java - Java 可以处理多少个音频片段?

python-3.x - 使用 Python 在函数中传递多个列表时出现问题

ios - 如何在新数组中捕获过滤后的值