J'ai une liste d'instances d'une classe personnalisée:

data class Flight(val duration: Int)

Par exemple:

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

Comment trouver le plus efficacement possible le premier index de l'élément minimum dans cette liste? Dans ce cas, le premier indice de l'élément min est 1, car vols [1] .duration = 5.

4
grolegor 20 mars 2019 à 14:54

3 réponses

Meilleure réponse

Quelque chose comme ça serait "le plus efficace", je suppose:

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
}

Et celui-ci fait essentiellement la même chose et a l'air beaucoup mieux:

flights.withIndex().minBy { (_, f) -> f.duration }?.index
6
s1m0nw1 20 mars 2019 à 12:19

Avec minBy () pour obtenir la liste article avec la durée minimale
puis indexOf () pour obtenir son indice:

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

Pour seulement 1 scan de la liste, vous pouvez faire une boucle classique:

var index = if (flights.isEmpty()) -1 else 0
flights.forEachIndexed { i, flight ->
    if (flight.duration < flights[index].duration) index = i
}
5
forpas 20 mars 2019 à 12:30

Essayer

val index = flights.minBy { it.duration }?.let { flights.indexOf(it) }
0
TomH 20 mars 2019 à 12:34