Как отсортировать строки с условием, используя потоковый API - PullRequest
0 голосов
/ 16 января 2019

Я изучаю потоковый 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 <Pair <String, Long> например:

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

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Comparator.comparingInt(String::length).reversed().thenComparing(Comparator.<String>naturalOrder())

0 голосов
/ 16 января 2019
phones.stream()
      .sorted((a,b) -> b.length()-a.length() == 0? a.compareTo(b) : b.length()-a.length())
      .forEach(System.out::println);
0 голосов
/ 16 января 2019

Добавьте thenComparing() в цепочку компаратора, чтобы создать дополнительный порядок сортировки. Он будет применяться, когда первичной сортировки недостаточно:

phones.stream()
      .sorted(Comparator.comparingInt(String::length).reversed()
                        .thenComparing(Function.identity()))
      .forEach(System.out::println);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...