Java 如何使用流API按条件对行进行排序
我学习流API,我有这个任务。我需要按照列表集合的长度顺序对其进行排序,如果几行的长度相同,则按字母顺序进行排序 我的代码:Java 如何使用流API按条件对行进行排序,java,java-stream,Java,Java Stream,我学习流API,我有这个任务。我需要按照列表集合的长度顺序对其进行排序,如果几行的长度相同,则按字母顺序进行排序 我的代码: List<String> phones = new ArrayList<String>(); Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P", "Samsung Galaxy S8", "LG G6", "Xiaomi MI6",
List<String> phones = new ArrayList<String>();
Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P",
"Samsung Galaxy S8", "LG G6", "Xiaomi MI6", "Sony Xperia Z5",
"ASUS Zenfone 3", "Meizu Pro 6", "Heizu Pro 6",
"Pixel 2");
phones.stream().sorted(Comparator.comparingInt(String::length).reversed()).forEach(System.out::println);
正如你看到的线
Sony Xperia Z5
ASUS Zenfone 3
和线路:
Meizu Pro 6
Heizu Pro 6
但我的结果必须是:
Samsung Galaxy S8
Huawei Nexus 6P
ASUS Zenfone 3
Sony Xperia Z5
Heizu Pro 6
Meizu Pro 6
Xiaomi MI6
iPhone X
Nokia 9
Pixel 2
LG G6
如何改进代码,使其在长度相同的情况下按字母顺序排序
我们如何在列表>中收集结果?其中List添加到比较器链以创建二级排序顺序。当主要排序不足时,将应用此选项:
phones.stream()
.sorted(Comparator.comparingInt(String::length).reversed()
.thenComparing(Function.identity()))
.forEach(System.out::println);
Comparator.comparingInt(String::length).reversed()。然后比较(Comparator.naturalOrder())
Neat。我不知道有这样一个内置的比较器。String::toString
而不是String::compareTo
会工作吗?(真诚地询问)或Function.identity()
,不确定什么是表达它的最佳方式。编辑我的答案以使用Function.identity()
然后比较(Comparator.naturalOrder())
更有意义我相信我们如何在列表中收集结果?添加一些解释可能会有所帮助。可能会改进为Comparator Comparator=(o1,o2)->o2.length()==o1.length()?o1.compareTo(o2):整数.compare(o2.length(),o1.length())代码>
String a = Abcd;
list.add(new Pair(a, a.length));
phones.stream()
.sorted(Comparator.comparingInt(String::length).reversed()
.thenComparing(Function.identity()))
.forEach(System.out::println);
phones.stream()
.sorted((a,b) -> b.length()-a.length() == 0? a.compareTo(b) : b.length()-a.length())
.forEach(System.out::println);