【发布时间】:2009-12-23 11:03:38
【问题描述】:
我在 Scala 中有一个带有 ArrayBuffer[Actor] 类的数组,其中 Actor 是一个实现 Ordered[Actor] 特征的类。如何在不手动编码的情况下对该数组进行排序?
我知道有一个名为 Sorting 的对象,但它似乎不起作用,因为 ArrayBuffer 没有实现/扩展正确的类。
如何对ArrayBuffer[A] 类型的数组进行排序?
【问题讨论】:
我在 Scala 中有一个带有 ArrayBuffer[Actor] 类的数组,其中 Actor 是一个实现 Ordered[Actor] 特征的类。如何在不手动编码的情况下对该数组进行排序?
我知道有一个名为 Sorting 的对象,但它似乎不起作用,因为 ArrayBuffer 没有实现/扩展正确的类。
如何对ArrayBuffer[A] 类型的数组进行排序?
【问题讨论】:
如果您使用的是 Scala 2.8,则可以使用继承自 SeqLike 特征的 ArrayBuffer[T] 类的 sortWith 方法。
下面的代码 sn -p 对ArrayBuffer[T] 对象进行升序排序:
def ascendingSort[T <% Ordered[T]](xs: ArrayBuffer[T]) = xs.sortWith(_ < _)
请注意,这不会改变实际的ArrayBuffer,而是创建一个具有正确顺序的元素的新@。
如果您使用的是 Scala 2.7,则可以使用 Sorting 对象的 stableSort 方法。这将获取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:
缓冲区用于增量创建元素序列
当您将它与Actors 一起使用时,它可能用于某种类型的actor 队列——在这种情况下,您可能需要查看Queue 集合。
希望对你有帮助,
-- 弗拉维乌·西普西根
【讨论】:
顺便说一句,这里的 Actor 类是我自己的类,用于在使用我的 scala 新游戏引擎(“Awesome Game Engine for Scala ~ AGES”)创建的世界中的“Actors”,因此它与并发无关演员班。此外,scala 中列表的实现是一片丛林,一切要么被弃用,要么以多种不同的方式实现......ArrayBuffer 满足我的需要(我需要一个可变大小的数组来包含演员)。
希望这可以澄清:)
【讨论】: