Как деконструировать метод сортировки по длине строк (по убыванию) в Scala? - PullRequest
2 голосов
/ 01 апреля 2020

Я наткнулся на этот фрагмент кода, который сортирует коллекцию строк в порядке убывания по длине:

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

Может кто-нибудь помочь мне понять, в чем цель - перед x и разбирать этот код по частям? Это означает «обратную» операцию? Я знаю, что это целочисленная операция, но мне трудно понять, как работает алгоритм в фоновом режиме. Также это можно считать пузырьковой сортировкой?

1 Ответ

6 голосов
/ 01 апреля 2020

Если у вас есть:

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

, когда вы делаете:

collection.sortBy(keyToSortBy)

, то получается, что Scala будет искать Ordering[B] в своей неявной области (читайте о последствиях) если вы еще не знакомы с ними), и он будет использовать методы, предоставленные этим интерфейсом, для сравнения элементов с помощью алгоритма сортировки.

sortBy будет использовать Ordering[X] для сортировки вещей в порядке возрастания (подумайте Comparator если вы знаете Java). Для Ordering[Int] это просто увеличение порядка целых чисел, для Ordering[String] у вас есть лексический порядок Strings.

Что - здесь делает, это берет значение перед передачей его алгоритму, сортирующему по Int и отрицая это. Было бы проще, если бы вы увидели какой-то пример:

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

Если мы поместим туда -, то, что Ordering получит для компиляции, будет другим:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...