Cómo deconstruir un método para ordenar por tiempo de cuerdas (descendente) en Scala?

hora:

Me encontré con este pedazo de código que ordena una colección de cadenas por orden decreciente de longitud:

words.sortBy(x => -x.length)

¿Puede alguien ayudarme a entender cuál es el propósito de la -frente xes y deconstruir esta pieza a pieza de código? ¿Está de pie para la operación 'inversa'? Sé que es la operación de enteros pero estoy teniendo un tiempo difícil encontrar la manera de que el algoritmo funciona en segundo plano. También puede esto ser considerada una especie de burbuja?

Mateo Kubuszok:

Si usted tiene:

val collection: SomeCollection[A]
val keyToSortBy A => B

Cuando tu lo hagas:

collection.sortBy(keyToSortBy)

lo que sucede es que Scala buscará Ordering[B]en su alcance implícito (leer sobre implícitos si usted no está familiarizado con ellos todavía), y utilizará métodos proporcionados por esta interrface comparar elemetns por algoritmo de ordenación.

sortByutilizará Ordering[X]para ordenar las cosas en orden ascendente (piense Comparatorsi usted sabe de Java). Por Ordering[Int]su orden en el aumento de los números enteros simplemente, para Ordering[String]que tenga una orden léxica de Strings.

¿Qué -hace aquí es tomar el valor antes de pasarlo al algoritmo de ordenación por Inty reducirla a la nada. Sería más fácil si ves algún ejemplo:

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 ponemos -allí, lo que Orderingpodría llegar a compate sería diferente:

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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=384386&siteId=1
Recomendado
Clasificación