Список упорядочения по определенному символу (Java 8) - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть следующий список:

List<String> fruits = new ArrayList<String>(Arrays.asList("Apple", "Banana", "Orange", "Watermelon", "Peach")); 

Мне нужно заказать его с этим условием:

  1. Во-первых, те, которые содержат символ "o" или "O"
  2. Затем остальные из них.

Результат должен быть:

Orange, Watermelon, Apple, Banana, Peach

Как я могу сделать это в Java 8?

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете использовать цепочку Comparator.

List<String> fruits = new ArrayList<>(Arrays.asList(
                               "Apple", "Banana", "Orange", "Watermelon", "Peach"));
fruits.sort(Comparator.comparing((String s) -> !s.contains("O") && !s.contains("o"))
        .thenComparing(Comparator.naturalOrder()));
System.out.println(fruits.stream().collect(Collectors.joining(", ")));

Первый компаратор проверяет, содержит ли строка букву O, делающую те, которые идут первыми, а второй компаратор использует естественное упорядочение.

Примечание: Boolean.TRUE.compareTo(Boolean.FALSE) > 0, чтобы строки, содержащие O, пошли первыми, я перевожу это на !

Это печатает

Orange, Watermelon, Apple, Banana, Peach

ПРИМЕЧАНИЕ. В этом случае new ArrayList<>( ... ) не требуется, поскольку sort не меняет количество элементов, а просто переупорядочивает их.


РЕДАКТИРОВАТЬ: На основе предложения @ Хольгера.

Если предпочтительна стабильная сортировка, то есть оставить заказ как можно больше.

List<String> fruits = Arrays.asList(
        "Watermelon", "Peach", "Orange", "Banana", "Apple");
fruits.sort(Comparator.comparing((String s) -> !s.contains("O") && !s.contains("o")));
System.out.println(fruits.stream().collect(Collectors.joining(", ")));

печать

Watermelon, Orange, Peach, Banana, Apple
...