我在Scala中有一个类ArrayBuffer[Actor]
的数组,其中Actor
是一个实现Ordered[Actor]
特征的类。如何在不对其进行手动编码的情况下对此数组进行排序?
我知道有一个名为Sorting
的对象,但它似乎没有用,因为ArrayBuffer
没有实现/扩展正确的类。
如何对ArrayBuffer[A]
类型数组进行排序?
答案 0 :(得分:7)
如果您使用的是Scala 2.8,则可以使用sortWith
类的ArrayBuffer[T]
方法,该方法继承自SeqLike
特征。
以下代码段按升序对ArrayBuffer[T]
对象进行排序:
def ascendingSort[T <% Ordered[T]](xs: ArrayBuffer[T]) = xs.sortWith(_ < _)
请注意,这并不会改变实际的ArrayBuffer
,而是会以正确的顺序创建一个新元素。
如果您使用的是Scala 2.7,则可以使用stableSort
对象的Sorting
方法。这将获取ArrayBuffer
的元素并生成按正确顺序排序的元素数组(由闭包作为参数给出,默认为升序)。
例如:
val a = new scala.collection.mutable.ArrayBuffer[Int]()
a += 5
a += 2
a += 3
scala.util.Sorting.stableSort(a)
重要的问题是你想对ArrayBuffer
做些什么。通常,在不同算法中内部使用Buffer
以提高中间结果的性能。如果您正在使用它,请查看在算法结束时对要返回的集合进行排序的方法。 Sorting
对象已经提供了将ArrayBuffer
转换为已排序的Array
的方法。
来自Buffer
类的scaladoc:
缓冲区用于逐步创建元素序列
当您将其与Actor
一起使用时,它可能会用于某种类型的actor队列 - 在这种情况下,您可能需要查看Queue
集合。
希望它有所帮助,
- Flaviu Cipcigan
答案 1 :(得分:0)
顺便说一句,这里的Actor类是我自己的类,用于使用我的scala新游戏引擎(“Scala~AGES的真棒游戏引擎”)创建的世界中的“Actors”,所以它与并发性无关演员班。此外,scala中列表的实现是一个丛林,一切都被弃用或以很多不同的方式实现... ArrayBuffer适合我的需要(我需要一个可变大小的数组用于包含actor)。
希望这澄清:)