你可以对可变的Scala集合进行排序吗?

Mat*_*att 7 sorting collections scala

是否可以对ArrayBuffer或其他可变Scala集合进行排序?我看到ArrayBuffer.sorted(和sortBy)返回一个新集合,而Sorting.quicksort确实对Array进行了排序,但是在ArrayBuffers上不起作用.

我问的原因是我在Spark中使用combineByKey来构建大小有限的得分对象集合(如按键的"十大"列表).如果我合并一个新对象并且该集合已经处于容量状态,我需要删除得分最低的对象.我可以使用像PriorityQueue或SortedSet这样的已排序集合,但我不需要一直对集合进行排序,只有在集合填满时才会这样.

那么是否有一些方法可以对ArrayBuffer或ListBuffer进行排序?或者是否有其他一些支持追加和排序的集合?我确信有更好的方法可以做到这一点,但我是Scala的新手.

mar*_*ios 6

您可以使用 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.

  • 如果您想将您的 ArrayBuffer 转换为一个数组,那么您可以使用 Sorting.quicksort(myArray) 对其进行排序,而无需求助于 Java 库。但就我而言,我不想将缓冲区转换为固定大小的数组,因为我有更多元素要添加到其中。 (3认同)

Rex*_*err 3

目前没有用于对藏品进行分类的设施。也就是说,如果您希望极少进行排序,您可以研究分别支持两者,例如Either[PriorityQueue[A], ArrayBuffer[A]]; 或者,如果您希望排序相当普遍,您应该使用一种数据结构,这样您就不必在每次添加元素时付出这样的代价——这意味着只需使用SortedSetor PriorityQueue。否则你会变得慢得很快。(n^2 log n变得很快,如果每次添加新元素时都进行完整排序,就会得到这样的结果。)