Фильтр списка строк с содержимым и отсортированным по позиции содержит - PullRequest
1 голос
/ 14 апреля 2020

У меня есть список строк, скажем

var list = mutableListOf("clock", "kite", "rekt")

Теперь мне нужно отфильтровать список по символам. В настоящее время я фильтрую по:

list.filter { it.contains("k") }

Это дает мне результат

[clock, kite, rekt]

Но вот где у меня проблема, я хочу чтобы отфильтровать список, а также отсортировать его по позиции символа, и ожидаемый результат будет

[kite, rekt, clock]

, где символ «k» стоит первым, находится в списке первым и т. д.

Я запутался, что делать. Заранее спасибо.

1 Ответ

2 голосов
/ 14 апреля 2020

Для сортировки вы должны использовать Comparator. Контракт компаратора описан здесь в методе сравнения здесь

Сравнивает два его аргумента для заказа. Возвращает ноль, если аргументы равны, отрицательное число, если первый аргумент меньше второго, или положительное число, если первый аргумент больше второго.

Так что в нашем случае мы берем две строки a и b и мы посмотрим, в каком положении находится k.

Пример:

a = "clock" // position of 'k' is 4
b = "kite" // position of 'k' is 0

Сравнение этих двух 4 - 0 = 4 приводит к положительному числу, которое означает, что первый аргумент больше второго.

a = "kite" // position of 'k' is 0
b = "rekt" // position of 'k' is 3

Сравнение этих двух 0 - 3 = -3 приводит к отрицательному числу, что означает, что первый аргумент меньше второго.

Код:

var list = mutableListOf("clock", "kite", "rekt", "abcd")
list.retainAll { it.contains("k") }

// Ascending Order
list.sortWith(Comparator {a, b -> a.indexOf('k') - b.indexOf('k')})
println(list) // [kite, rekt, clock]

// Descending Order
list.sortWith(Comparator {a, b -> b.indexOf('k') - a.indexOf('k')})
println(list) // [clock, rekt, kite]

// Cleaner and more concise syntax thanks to @Tenfour04
list.sortWith( compareBy { it.indexOf('k') } )
list.sortWith( compareByDescending { it.indexOf('k') } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...