Как отсортировать массив в Scala?
Я вижу, что есть объект сортировки, Sorting с quicksort метод quickSort, на нем.
каким будет пример кода его использования, сортируя массив объектов произвольного типа? Похоже, мне нужно пройти в реализации Orderable черта, но я не уверен в синтаксисе.
кроме того, я бы предпочел, чтобы ответы делали это "Scala way". Я знаю, что могу просто использовать библиотеку Java.
7 ответов:
сортировка.quickSort объявляет функции для взятия массива чисел или строк, но я предполагаю, что вы хотите отсортировать список объектов ваших собственных классов?
функция, которую я думаю, что вы смотрите на это
quickSort [K](a : Array[K])(implicit view : (K) => Ordered[K]) : Unitчто, если я читаю это право, означает, что объекты в массиве должны иметь
Orderedчерта. Поэтому ваш класс должен расширятьсяOrdered(или должен смешать его), и поэтому должен реализоватьcompareметод этой черты.так чтобы оторвать пример из книги:
class MyClass(n: Int) extends Ordered[MyClass] { ... def compare(that: MyClass) = this.n - that.n }Итак, задан массив[MyClass], затем сортировка.быстрая сортировка должна работать.
С помощью Scala 2.8 или более поздней версии можно сделать:
List(3,7,5,2).sortWith(_ < _)использует java.утиль.Матрицы.сортировка, реализация quicksort.
Если вы просто хотите сортировать вещи, но не женаты на объекте сортировки в частности, вы можете использовать метод сортировки списка. Он принимает функцию сравнения в качестве аргумента, поэтому вы можете использовать ее на любых типах, которые вы хотите:
List("Steve", "Tom", "John", "Bob").sort((e1, e2) => (e1 compareTo e2) < 0) List(1, 4, 3, 2).sort((e1, e2) => (e1 < e2))списки, вероятно, квалифицируются как" более скалярные", чем массивы.
из api scala docs:
def sort(lt : (A, A) = > Boolean) : List[A]
Sort the list according to the comparison function <(e1: a, e2: a) =>boolean, который должно быть верно, если e1 меньше, чем Е2.
val array = Array((for(i <- 0 to 10) yield scala.util.Random.nextInt): _*) scala.util.Sorting.quickSort(array)массив "по умолчанию" Scala-это изменяемая структура данных, очень близкая к массиву Java. Вообще говоря, это означает, что "массив" не очень Scala-ish, даже когда изменяемые структуры данных идут. Но это служит определенной цели. Если array-это правильный тип данных для вашей потребности, то именно так вы его сортируете. Есть и другие методы сортировки по сортировке объектов, кстати.
Я думаю, что только что понял, в чем ваш вопрос... вам не нужно передавать какой-либо неявный параметр (это неявно, в конце концов.) Этот параметр существует, чтобы сказать, что должен быть какой-то способ преобразовать тип K в упорядоченный[K]. Эти определения уже существуют для классов Scala, поэтому они вам не нужны.
для произвольного класса вы можете определить его следующим образом:
scala> case class Person(name: String) defined class Person scala> val array = Array(Person("John"), Person("Mike"), Person("Abe")) array: Array[Person] = Array(Person(John), Person(Mike), Person(Abe)) scala> scala.util.Sorting.quickSort(array) <console>:11: error: no implicit argument matching parameter type (Person) => Ordered[Person] was found. scala.util.Sorting.quickSort(array) ^ scala> class OrderedPerson(val person: Person) extends Ordered[Person] { | def compare(that: Person) = person.name.compare(that.name) | } defined class OrderedPerson scala> implicit def personToOrdered(p: Person) = new OrderedPerson(p) personToOrdered: (p: Person)OrderedPerson scala> scala.util.Sorting.quickSort(array) scala> array res8: Array[Person] = Array(Person(Abe), Person(John), Person(Mike))Теперь, если бы человеку было приказано начать, это не было бы проблемой:
scala> case class Person(name: String) extends Ordered[Person] { | def compare(that: Person) = name.compare(that.name) | } defined class Person scala> val array = Array(Person("John"), Person("Mike"), Person("Abe")) array: Array[Person] = Array(Person(John), Person(Mike), Person(Abe)) scala> scala.util.Sorting.quickSort(array) scala> array res10: Array[Person] = Array(Person(Abe), Person(John), Person(Mike))
хотя принятый ответ не ошибочен, метод quicksort обеспечивает большую гибкость, чем это. Я написал этот пример для вас.
import System.out.println import scala.util.Sorting.quickSort class Foo(x:Int) { def get = x } //a wrapper around Foo that implements Ordered[Foo] class OrdFoo(x:Foo) extends Ordered[Foo] { def compare(that:Foo) = x.get-that.get } //another wrapper around Foo that implements Ordered[Foo] in a different way class OrdFoo2(x:Foo) extends Ordered[Foo] { def compare(that:Foo) = that.get-x.get } //an implicit conversion from Foo to OrdFoo implicit def convert(a:Foo) = new OrdFoo(a) //an array of Foos val arr = Array(new Foo(2),new Foo(3),new Foo(1)) //sorting using OrdFoo scala.util.Sorting.quickSort(arr) arr foreach (a=>println(a.get)) /* This will print: 1 2 3 */ //sorting using OrdFoo2 scala.util.Sorting.quickSort(arr)(new OrdFoo2(_)) arr foreach (a=>println(a.get)) /* This will print: 3 2 1 */Это показывает, как неявные и явные преобразования из Foo в некоторый класс, расширяющий Ordered[Foo], могут использоваться для получения разных порядков сортировки.
Я предпочитаю сортировка util
пример :
val arr = Array(7,5,1, 9,2) scala.util.Sorting.quickSort(arr)пожалуйста, прочитайте это для получения дополнительной информации сортировка util
Comments