在Scala中覆盖排序[Int]

时间:2013-09-11 18:59:32

标签: scala

我正在尝试使用自定义排序对整数数组进行排序。

E.g。

quickSort[Int](indices)(Ordering.by[Int, Double](value(_)))

基本上,我正在尝试按特定列的值对行的索引进行排序。当我在一个相当大的数据上运行它时,我最终得到一个stackoverflow错误。如果我使用更直接的方法(例如排序元组),这不是问题。

如果您尝试扩展默认订购[Int]?

是否有问题

您可以像这样重现:

val indices = (0 to 99999).toArray
val values = Array.fill[Double](100000)(math.random)
scala.util.Sorting.quickSort[Int](indices)(Ordering.by[Int, Double](values(_))) // Works
val values2 = Array.fill[Double](100000)(0.0)
scala.util.Sorting.quickSort[Int](indices)(Ordering.by[Int, Double](values2(_))) // Fails

更新

我认为我发现了问题所在(正在回答我自己的问题)。似乎我通过改变整数的排序定义来创建一个矛盾的情况。

在quickSort算法本身中,数组位置也是整数,并且有一些比较数组位置的语句。此位置比较应遵循标准整数排序。

但是由于新的定义,现在这些位置比较器也跟随索引值比较器,事情变得非常混乱。

我认为至少目前,我不应该更改这些默认值类型排序,因为库可能依赖于默认值类型排序。

UPDATE2

事实证明,上面的问题实际上不是问题,并且当与Ordering一起使用时,quickSort中存在一个错误。当定义新的Ordering时,Ordering中的相等运算符是'equiv',但quickSort使用'=='。这导致比较指数,而不是比较索引值。

0 个答案:

没有答案