Вы можете использовать цепочку 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