82 votes

En Kotlin, puis-je créer une plage qui compte à rebours ?

J'ai regardé la documentation pour les Gammes et je ne vois aucune mention de plages arrière.

Est-il possible de faire quelque chose comme :

for (n in 100..1) {
    println(n)
}

Et obtenir des résultats :

100
99
98
...

145voto

Hadi Hariri Points 904

Utilisez downTo comme dans :

for (n in 100 downTo 1) {
//
}

47 votes

Pourquoi ce n'est pas "for (n in 100..1)" ? Ne pourrait-on pas convenir que si le premier nombre est plus grand, alors une plage compte à rebours ?

2 votes

Existe-t-il un moyen d'exclure la limite inférieure ? Par exemple, si je veux aller de 100 à 2 et que je veux exclure 1.

3 votes

@x2bool, bien qu'il soit utile, il y a des situations où il ne l'est pas. Par exemple, vous voulez faire une boucle à partir de 0 à count - 1 mais ne veulent pas vérifier les limites (comme en Java). Si count devient 0, vous aurez 0 downto -1 qui va briser un algorythme.

20voto

Escape Velocity Points 589

Comme indiqué par d'autres, la bonne réponse est

for (n in 100 downTo 1) {
    println(n)
}

Mais pourquoi l'équipe de Kotlin a choisi 100 downTo 1 vs 100..1 ?

Je pense que la syntaxe 100..1 serait mauvais lorsque nous essayons d'utiliser des variables au lieu de littéraux. Si nous avons tapé

for (n in b..a)

alors il ne serait pas clair quelle boucle nous voulons utiliser.

Nous avions peut-être l'intention de compter à rebours, mais si b s'avère être plus petit que a alors notre programme compterait vraiment pour le mieux ! Ce serait une source de bugs.

12voto

Franck Rasolo Points 481

Les plages inversées sont prises en charge à l'aide de la fonction "moins". - opérateur unaire comme dans -(1..100) .

Pour invoquer une méthode sur cette plage, vous devrez ensuite l'entourer de parenthèses, comme dans le cas suivant

(-(1..100)).foreach { println(it) }

6 votes

Est-il possible de rendre la fonction rangeTo() un peu plus intelligente et de gérer cela automatiquement ? Pour moi, avoir une plage négative signifie compter de -1 à -100.

0 votes

Je vous suggère de jeter un coup d'œil aux problèmes suivants liés aux plages en Kotlin et de soumettre un nouveau problème expliquant en détail votre suggestion : KT-861 , KT-1045 , KT-1076

0 votes

Cela ne passe pas l'analyse statique dans kotlin 1.3

9voto

letner Points 406

Juste à titre d'exemple d'une fonction de portée universelle pour "for" :

private infix fun Int.toward(to: Int): IntProgression {
    val step = if (this > to) -1 else 1
    return IntProgression.fromClosedRange(this, to, step)
}

Utilisation :

// 0 to 100
for (i in 0 toward 100) {
    // Do things
}

// 100 downTo 0
for (i in 100 toward 0) {
    // Do things
}

3 votes

Il n'y a donc pas d'équivalent natif de Kotlin pour cela ?

1 votes

Je n'en ai pas trouvé. Vous pouvez obtenir le même résultat, par exemple en utilisant étape pour une certaine progression, mais vous devez toujours calculer l'étape par vous-même. Je suppose que les architectes de Kotlin veulent créer un langage parfaitement lisible. Cela signifie que l'exécution du code doit être exactement la même que celle qui est écrite, et une fonction infixe universelle comme mon "vers" ne correspond pas tout à fait à cette idée.

4voto

CoolMind Points 11
(100 downto 1).map{ println(it) }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X