我想通过降低字符串长度来对不可变列表的副本进行排序。我必须在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"
答案 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#sort
和Comparator#comparingInt
和Comparator#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());