给定一个ArrayBuffer [Double],如何通过维护它们的索引来对其元素进行排序,例如
val arr ArrayBuffer[Double] = ArrayBuffer(4,5.3,5,3,8,9)
Run Code Online (Sandbox Code Playgroud)
结果必须是:
arrSorted = ArrayBuffer(3,4,5,5.3,8,9)
indices = Arraybuffer(3,0,2,1,4,5) //here the data structure doesn't matter, it can be Array, List, Vector, etc.
Run Code Online (Sandbox Code Playgroud)
谢谢
Tra*_*own 10
这是一个单行:
val (addSorted, indices) = arr.zipWithIndex.sorted.unzip
Run Code Online (Sandbox Code Playgroud)
一步一步地zipWithIndex创建一个元组集合,索引作为每个元组中的第二个值:
scala> println(arr.zipWithIndex)
ArrayBuffer((4.0,0), (5.3,1), (5.0,2), (3.0,3), (8.0,4), (9.0,5))
Run Code Online (Sandbox Code Playgroud)
sorted按字典顺序对这些元组进行排序(这几乎可以肯定是你想要的,但你也sortBy(_._1)可以明确表示你想按值排序):
scala> println(arr.zipWithIndex.sorted)
ArrayBuffer((3.0,3), (4.0,0), (5.0,2), (5.3,1), (8.0,4), (9.0,5))
Run Code Online (Sandbox Code Playgroud)
unzip然后把这个元组集合变成一个集合元组,你可以用它来解构val (addSorted, indices) = ....