scala - 如何对 ArrayBuffer[Double] 进行排序并保存索引

标签 scala

给定一个 ArrayBuffer[Double],如何在保持其索引的同时对其元素进行排序,例如

val arr ArrayBuffer[Double] = ArrayBuffer(4,5.3,5,3,8,9)

结果必须是:
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.

谢谢

最佳答案

这是一个单行:

val (addSorted, indices) = arr.zipWithIndex.sorted.unzip

一步一个脚印,zipWithIndex创建一个元组集合,索引作为每个元组中的第二个值:
scala> println(arr.zipWithIndex)
ArrayBuffer((4.0,0), (5.3,1), (5.0,2), (3.0,3), (8.0,4), (9.0,5))
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))
unzip然后将此元组集合转换为集合元组,您可以使用 val (addSorted, indices) = ... 对其进行解构.

关于scala - 如何对 ArrayBuffer[Double] 进行排序并保存索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736730/

相关文章:

scala - 如何反转/翻转/反转/交换 scala 的选项?

scala - 从 SparkSession 检索 SparkContext

scala - Spark SQL中如何按列降序排序?

scala - 组合可变参数和高阶函数

java - Scala murmur 哈希与 Java 原生哈希

scala - 将 Akka Http 服务的一些 Path Parameters 更改为 Query Params

postgresql - jdbc-HikariCP : Seeing low insert thoughput while DB/App cpu % is still low

scala - 是否有用于 GUI 的 Scala DSL?

scala - 在 Spark JDBC 读取方法中使用谓词

java - Skype4Java 在 Mac OS 上通过 Scala