Сортировка массива строк с приоритетом для символов «s» и «k»

Задайте comparator по двум ключам: сначала признак приоритетной строки s/k, затем естественный порядок. Поскольку List.of неизменяем, сортируйте новую коллекцию.

Короткий ответ

Что ответить на собеседовании

Задайте comparator по двум ключам: сначала признак приоритетной строки s/k, затем естественный порядок. Поскольку List.of неизменяем, сортируйте новую коллекцию.

Подробный разбор

Ответ с пояснениями

Условие

Дан массив строк. Требуется упорядочить его согласно следующим правилам:

  1. Строки, равные «s» и «k», должны оказаться в начале массива (порядок между ними не важен);
  2. Оставшиеся строки сортируются в лексикографическом порядке;
  3. В исходном массиве могут присутствовать любые строчные буквы.
public class Main{
    public static void main(String[] args){
        List<String> list = List.of("f", "z", "y", "e", "b", "i", "g", "a", "k", "h", "s", "w");
    }
}

Ответ

Задайте comparator по двум ключам: сначала признак приоритетной строки s/k, затем естественный порядок. Поскольку List.of неизменяем, сортируйте новую коллекцию.

List<String> sorted = list.stream()
        .sorted(java.util.Comparator
                .comparingInt((String s) -> s.equals("s") || s.equals("k") ? 0 : 1)
                .thenComparing(java.util.Comparator.naturalOrder()))
        .collect(java.util.stream.Collectors.toList());

Для примера получится [k, s, a, b, e, f, g, h, i, w, y, z]. Правило касается точного равенства s и k, не начала произвольной строки. Null в исходных данных не предполагается. Время O(n log n), память O(n), исходный список сохраняется.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее