java - 如何使用流 API 根据条件对行进行排序

标签 java java-stream

我研究stream API,我有这个任务。我需要将List集合按照长度排序,如果几行长度相同,则按字母顺序排序。

我的代码:

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);

我得到了这个输出:

Samsung Galaxy S8
Huawei Nexus 6P
Sony Xperia Z5
ASUS Zenfone 3
Meizu Pro 6 
Heizu Pro 6
Xiaomi MI6
iPhone X
Nokia 9
Pixel 2
LG G6

如你所见

 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 > 中收集结果?在哪里List <Pair <String, Long>例如:

String a = Abcd;
list.add(new Pair(a, a.length));

最佳答案

添加thenComparing()到您的比较器链以创建二级排序顺序。当主要排序不够时将应用它:

phones.stream()
      .sorted(Comparator.comparingInt(String::length).reversed()
                        .thenComparing(Function.identity()))
      .forEach(System.out::println);

关于java - 如何使用流 API 根据条件对行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54220435/

相关文章:

java - OSX UnsatisfiedLinkErrors 在 OSX catalina 10.15.x 上运行 JNI 包装的库

java - sendMultipartTextMessage 作为多条 SMS 消息发送?

java - 将JSON反序列化为通用映射,强制将所有JSON float 转换为Decimal或String,在Jackson中

java - 如何将行数据从 1 个 JTable 移动到另一个 JTable?

java - 获取符合条件的流的第一个元素

java - 如何仅在 Java 中将相同长度的 BitSet 设置为 true 的索引处对 int[] 进行排序

java - 从数组流式传输时,为什么我不能将整数映射到字符串?

Java流,如何将函数应用于先前的结果

Java减少列表到回退链

java - 同时过滤和映射一个java流