Je suis tombé sur ce morceau de code qui trie une collection de chaînes en ordre décroissant par longueur:
words.sortBy(x => -x.length)
Aider quelqu'un peut me comprendre quel est le but de -
devant x
est et déconstruire ce morceau de code par pièce? Est - il debout pour l' opération « inverse »? Je sais que le fonctionnement de entier mais je vais avoir du mal à comprendre comment l'algorithme fonctionne en arrière - plan. Peut - il être considéré comme une sorte de bulle?
Si tu as:
val collection: SomeCollection[A]
val keyToSortBy A => B
quand vous faites:
collection.sortBy(keyToSortBy)
ce qui se passe est que Scala va chercher Ordering[B]
dans son champ d' application implicite (lire implicits si vous n'êtes pas familier avec eux encore), et il utilisera des méthodes fournies par cette interrface pour comparer elemetns par l' algorithme de tri.
sortBy
utilisera Ordering[X]
pour trier les choses dans l' ordre croissant (pensez Comparator
si vous connaissez Java). Pour Ordering[Int]
cela de plus en plus l' ordre juste des entiers, car Ordering[String]
vous avez un ordre lexical de Strings
.
Que -
fait ici est de prendre la valeur avant de passer au tri de l' algorithme par Int
et niant. Il serait plus facile si vous voyez quelques exemples:
List("a", "bb", "ccc").sortBy(word => word.length)
// imagine that what it does is:
// - building a collection of pairs ("a", 1), ("bb", 2), ("ccc", 3)
// ( (value from collection, what function returned for that value) )
// - sorting by the second element of pair
// using normal Int comparison to get ascending result
// - take only the first element of each pair: ("a", 1), ("bb", 2), ("ccc", 3)
List("a", "bb", "ccc") // result
Si nous mettons -
là - bas, ce qui Ordering
arriverait à compate serait différent:
List("a", "bb", "ccc").sortBy(word => -word.length)
// - building a collection of pairs ("a", -1), ("bb", -2), ("ccc", -3)
// - sorting by the second element of pair - notice that all are negative now!!!
// using normal Int comparison to get ascending result
// - take only the first element of each pair: ("ccc", -3), ("bb", -2), ("a", -1)
List("ccc", "bb", "a") // result