Котлин: самый эффективный способ найти первый индекс минимального элемента в некотором списке некоторых объектов - PullRequest
2 голосов
/ 20 марта 2019

У меня есть список экземпляров некоторых пользовательских классов:

data class Flight(val duration: Int)

Например:

val flights = listOf(Flight(10), Flight(5), Flight(5), Flight(15), Flight(20))

Как наиболее эффективно найти первый индекс минимального элемента в этом списке? В этом случае первый индекс элемента min равен 1, потому что flight [1] .duration = 5.

Ответы [ 3 ]

3 голосов
/ 20 марта 2019

Что-то вроде этого было бы "наиболее эффективным", я думаю:

var min: Pair<Int, Flight>? = null
for (f in flights.withIndex()) {
    if (min == null || min.second.duration > f.value.duration) min = f.index to f.value
}

И этот в основном делает то же самое и выглядит намного лучше:

flights.withIndex().minBy { (_, f) -> f.duration }?.index
3 голосов
/ 20 марта 2019

С помощью minBy () , чтобы получить элемент списка с минимальной продолжительностью
а затем indexOf () , чтобы получить его индекс:

val index = flights.indexOf(flights.minBy { it.duration })

Всего за 1 просмотр списка вы можете выполнить классический цикл:

var index = if (flights.isEmpty()) -1 else 0
flights.forEachIndexed { i, flight ->
    if (flight.duration < flights[index].duration) index = i
}
0 голосов
/ 20 марта 2019

Попробуйте

val index = flights.minBy { it.duration }?.let { flights.indexOf(it) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...