在ActionScript3中对对象向量进行排序

3
我有一个对象向量,每个对象都有一些属性(日期、名称、ID等)。
我想按日期对向量进行排序。我看到数组支持sortOn()函数,但向量没有。
对象:
public final class DisciplineEvent {
    public var id:Number;
    public var name:String;
    public var date:Date;}

谢谢回答。

3
在对象方面,个人认为最好使用数组。因为对象是动态类型,所以本来使用 sortOn() 会比任何矢量的替代方法更好。无论如何,任何对象都可以派生为 Object 类型,所以创建一个 Vector.<Object> 是相当无意义的。 - Vesper
1
同意@Vesper的观点。数组的sortOn比您自己使用Vector的任何排序函数都要快得多,除非它存储原始数据类型,否则您不会从使用Vector中获得任何好处。 - Marty
谢谢你的回答。我使用了Marty Wallace的解决方案,对我来说最简单。 - Marek Mensik
当你说“你没有获得任何东西”时,你是什么意思?显然,在团队合作等方面,使用向量具有类型安全性,这是一个很大的收益,但我认为在总体性能方面也会有收益,难道不是吗? - MickMalone1983
2个回答

6
假设您有以下向量:
var objects:Vector<ObjectType> = new Vector<ObjectType>();
objects.push(obj1, obj2);

你可以按照以下方式对其进行排序:
var sortingFunction:Function = function(itemA:ObjectType, itemB:ObjectType):Number {
    if (itemA.date.valueOf() < itemB.date.valueOf()) return -1; //ITEM A is before ITEM B
    else if (itemA.date.valueOf() > itemB.date.valueOf()) return 1; //ITEM A is after ITEM B
    else return 0; //ITEM A and ITEM B have same date
}

objects.sort(sortingFunction);

更多信息请参见此处:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Vector.html#sort()

该链接提供了与ActionScript 3中的Vector类相关的排序方法的详细信息。

是的,甚至更好的做法是声明一个类范围内的(可能是私有的)函数,直接传递给向量。 - Vesper

5
您想要提高速度、访问数组的sortOn()功能,并将向量作为结果,最好的方法是将向量内容复制到数组中,使用sortOn(),然后再将内容复制回来。例如:
var vec:Vector.<Object> = new <Object>[
    { a: 2 }, { a: 1 }, { a: 12 }, { a: 7 }
];

var array:Array = [];
while(vec.length > 0) array.push(vec.pop());

array.sortOn("a", Array.NUMERIC|Array.DESCENDING);
while(array.length > 0) vec.push(array.pop());

for each(var i:Object in vec)
{
    trace(i.a);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接