Как я могу отсортировать элементы списка, которые являются строкой, используя фильтр в Kotlin? что не так в моем подходе? - PullRequest
0 голосов
/ 30 июня 2018
val spices = listOf("curry", "pepper", "cayenne", "ginger", "red curry", "green curry", "red pepper" )    
spices.filter { it }.sortedBy { it.length }

ошибка: вывод типа не выполнен: встроенное веселье Iterable.filter (предикат: (T) -> логический): список не может применяться к получатель: список аргументов: ((String) -> String)

spice.filter {it} .sortedBy {it.length} ^ ошибка: несоответствие типов: предполагаемый тип (String) -> String, но (String) -> ожидался логический spice.filter {it} .sortedBy {it.length}

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

filter требует предиката, возвращающего логическое значение. Смотрите декларацию:

public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

(T) -> Boolean означает, что он возвращает логическое значение и принимает входные данные типа T. T в этом случае it.

Строка не является логическим значением. Если у вас действительно есть список логических значений, вы можете сделать это:

val list = listOf(true, true, false, true, true, false )
val sortedList = list.filter{ it }

и это будет допустимо, потому что это логическое значение. Однако для всех других типов вам необходимо преобразовать его в логическую операцию, если вы собираетесь выполнять фильтрацию.

Однако, поскольку вы, кажется, на самом деле не делаете никакой фильтрации, просто удалите ее и сделайте следующее:

val sortedList = spices.sortedBy { it.length }

и если вам нужно как-то его отфильтровать, убедитесь, что вы получили логическую операцию или значение.

Чтобы на самом деле отсортировать это, вы должны сделать что-то со значением sortedBy В моем примере я назначаю его новому полю, но вы также можете назначить его предыдущему полю. Однако, если вы сделаете это, вы должны сделать это var, а не val.

0 голосов
/ 30 июня 2018

Фильтру требуется предикат внутри скобок, it не является предикатом. Вам не нужен фильтр для сортировки списка

Просто сделай:

val spices = mutableListOf<String>("curry", "pepper", "cayenne", "ginger", "red curry", "green curry", "red pepper" )
spices.sortBy { it.length }

Также изменить с listOf на mutableListOf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...