Mat*_*att 7 sorting collections scala
是否可以对ArrayBuffer或其他可变Scala集合进行排序?我看到ArrayBuffer.sorted(和sortBy)返回一个新集合,而Sorting.quicksort确实对Array进行了排序,但是在ArrayBuffers上不起作用.
我问的原因是我在Spark中使用combineByKey来构建大小有限的得分对象集合(如按键的"十大"列表).如果我合并一个新对象并且该集合已经处于容量状态,我需要删除得分最低的对象.我可以使用像PriorityQueue或SortedSet这样的已排序集合,但我不需要一直对集合进行排序,只有在集合填满时才会这样.
那么是否有一些方法可以对ArrayBuffer或ListBuffer进行排序?或者是否有其他一些支持追加和排序的集合?我确信有更好的方法可以做到这一点,但我是Scala的新手.
您可以使用 Java 的排序实用程序。
下面是一个例子:
val myArray = Array(1,12,5,6)
java.util.Arrays.sort(myArray)
Run Code Online (Sandbox Code Playgroud)
在 REPL:
> myArray
res3: Array[Int] = Array(1, 5, 6, 12)
Run Code Online (Sandbox Code Playgroud)
如果您拥有的是 Scala,ArrayBuffer则调用toArray将其转换为数组。
当然,toArrayon 会ArrayBuffer导致再次应对整个 Buffer 的成本。如果这很昂贵,请检查是否可以在.Array而不是ArrayBuffer. 如果结果是固定长度的并且不太可能增长,那么您就不需要ArrayBuffer.
目前没有用于对藏品进行分类的设施。也就是说,如果您希望极少进行排序,您可以研究分别支持两者,例如Either[PriorityQueue[A], ArrayBuffer[A]]; 或者,如果您希望排序相当普遍,您应该使用一种数据结构,这样您就不必在每次添加元素时付出这样的代价——这意味着只需使用SortedSetor PriorityQueue。否则你会变得慢得很快。(n^2 log n变得很快,如果每次添加新元素时都进行完整排序,就会得到这样的结果。)
| 归档时间: |
|
| 查看次数: |
2557 次 |
| 最近记录: |