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

时间:2020-06-06 15:14:47

标签: java list sorting collections

我想通过降低字符串长度来对不可变列表的副本进行排序。我必须在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"

4 个答案:

答案 0 :(得分:1)

使用comparing构建比较器,然后选择长度作为键并颠倒顺序

mutableList.sort(Comparator.comparing(String::length).reversed());

答案 1 :(得分:1)

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

Collections#sort的文档还规定以下内容:

保证这种排序是稳定的:相等元素不会由于排序而重新排序。

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

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

但是,我建议将List#sortComparator#comparingIntComparator#reversed结合使用,因为它比您当前的代码段对我而言更具可读性。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

排序本身已经得到了回答,但是您可以使用流而不是创建列表的显式副本。

List<String> sorted = possibleTexts.stream()
                          .sorted(Comparator.comparing(String::length).reversed())
                          .collect(Collectors.toList());