Exi*_*xia 3 java sorting scala
我想为scala Array扩展一个sort方法,它可以返回原始的indecies.
我在下面写的代码:
object ArrayExtend {
implicit class ArrayExtension(val array: Array[Int]) {
def argSort(): Array[Int] = {
var tupleArray = for (i <- 0 until array.length) yield (i, array(i))
tupleArray = tupleArray.sortWith((x,y)=> x._2 < y._2)
val result = for((index,_) <- tupleArray) yield index
return result.toArray
}
}
def main(args:Array[String]){
val array = Array(5,4,3,2,0)
for(i <- array.argSort()) print(i)
}
Run Code Online (Sandbox Code Playgroud)
}
此代码适用于Array [Int],如何将此方法扩展到所有不同类型的Array?我没有在AnyRef类中找到任何比较方法.
如果您需要该类型T可以隐式转换为它就足够了Ordered[T].通常可以通过向类或方法参数添加隐式转换器来完成(implicit converter: T => Ordered[T]),但是scala 为这种情况提供了精确的视图边界<%.从书中可以看出:你可以想到" T <% Ordered[T]"."我可以使用任何T,只要T可以作为一个对待Ordered[T]."
所以代码看起来像这样:
implicit class ArrayExtension[T <% Ordered[T]](val array: Array[T]) {
def argSort = array.zipWithIndex.sortBy(_._1).map(_._2).toArray
}
val array = Array(5,4,3,2,0)
val array2 = Array(5f,4f,3f,2f,0f)
array.argSort foreach print //43210
println
array2.argSort foreach print //43210
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |