有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用流API按条件对行进行排序

我学习流API,我有这个任务。我需要按照列表集合的长度顺序对其进行排序,如果几行的长度相同,则按字母顺序进行排序

我的代码:

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 <Pair <String, Long>例如:

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

共 (2) 个答案

  1. # 1 楼答案

    phones.stream()
          .sorted((a,b) -> b.length()-a.length() == 0? a.compareTo(b) : b.length()-a.length())
          .forEach(System.out::println);
    
  2. # 2 楼答案

    ^{}添加到比较器链中,以创建二级排序顺序。当主要排序不足时,将应用此选项:

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