Задайте comparator по двум ключам: сначала признак приоритетной строки s/k, затем естественный порядок. Поскольку List.of неизменяем, сортируйте новую коллекцию.
Сортировка массива строк с приоритетом для символов «s» и «k»
Задайте comparator по двум ключам: сначала признак приоритетной строки s/k, затем естественный порядок. Поскольку List.of неизменяем, сортируйте новую коллекцию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан массив строк. Требуется упорядочить его согласно следующим правилам:
- Строки, равные «s» и «k», должны оказаться в начале массива (порядок между ними не важен);
- Оставшиеся строки сортируются в лексикографическом порядке;
- В исходном массиве могут присутствовать любые строчные буквы.
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), исходный список сохраняется.