我可以看到有一个排序对象Sorting
,有一个快速排序方法quickSort
,就可以了.
什么是使用它的代码示例,排序任意类型的对象数组?看起来我需要传递Orderable
特征的实现,但我不确定语法.
另外,我更喜欢以"Scala方式"做到这一点的答案.我知道我可以使用Java库.
ade*_*rsq 98
使用Scala 2.8或更高版本,可以执行以下操作:
List(3,7,5,2).sortWith(_ < _)
Run Code Online (Sandbox Code Playgroud)
它使用java.util.Arrays.sort,一个quicksort的实现.
ska*_*man 32
Sorting.quickSort声明用于获取数字或字符串数组的函数,但我假设您的意思是要对自己类的对象列表进行排序?
我认为你正在看的功能是
quickSort [K](a : Array[K])(implicit view$1 : (K) => Ordered[K]) : Unit
Run Code Online (Sandbox Code Playgroud)
如果我正确地阅读,那意味着数组中的对象必须具有Ordered
特征.因此,您的类必须扩展Ordered
(或必须将其混合),因此必须实现该compare
特征的方法.
所以要从书中剔掉一个例子:
class MyClass(n: Int) extends Ordered[MyClass] {
...
def compare(that: MyClass) =
this.n - that.n
}
Run Code Online (Sandbox Code Playgroud)
所以给定一个Array [MyClass],那么Sorting.quickSort应该可行.
Pet*_*ore 19
如果您只想对事物进行排序,但特别是与Sorting对象没有结合,则可以使用List的排序方法.它需要一个比较函数作为参数,所以你可以在你喜欢的任何类型上使用它:
List("Steve", "Tom", "John", "Bob").sort((e1, e2) => (e1 compareTo e2) < 0)
List(1, 4, 3, 2).sort((e1, e2) => (e1 < e2))
Run Code Online (Sandbox Code Playgroud)
列表可能比阵列更符合"更多的scalaish".
来自scala api 文档:
def sort(lt:(A,A)=> Boolean):列表[A]
Run Code Online (Sandbox Code Playgroud)Sort the list according to the comparison function <(e1: a, e2: a) =>
布尔值,如果e1小于e2,则该值为true.
val array = Array((for(i <- 0 to 10) yield scala.util.Random.nextInt): _*)
scala.util.Sorting.quickSort(array)
Run Code Online (Sandbox Code Playgroud)
Scala的"默认"数组是一个可变数据结构,非常接近Java的Array.一般来说,这意味着"数组"不是非常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))
Run Code Online (Sandbox Code Playgroud)
现在,如果Person被命令开始,这不会是一个问题:
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))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
74701 次 |
最近记录: |