How do I sort an array in Scala?

后端 未结 7 680
北恋
北恋 2020-12-07 12:54

I can see there\'s a sorting object, Sorting, with a quicksort method, quickSort, on it.

What would be a code example of using it, sorting

7条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-07 13:51

    val array = Array((for(i <- 0 to 10) yield scala.util.Random.nextInt): _*)
    scala.util.Sorting.quickSort(array)
    

    Scala's "default" array is a mutable data structure, very close to Java's Array. Generally speaking, that means an "array" is not very Scala-ish, even as mutable data structures go. It serves a purpose, though. If array is the right data type for your need, then that is how you sort it. There are other sorting methods on object Sorting, by the way.

    I think I just realized what your question is... you don't need to pass any implicit parameter (it's implicit, after all). That parameter exists to say that there must be some way to convert the type K into an Ordered[K]. These definitions already exist for Scala's classes, so you don't need them.

    For an arbitrary class you can define it this way:

    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)
    :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))
    

    Now, if Person was Ordered to begin with, this wouldn't be a problem:

    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))
    

提交回复
热议问题