我正在尝试使用actionscript 3对大数组进行排序。
问题是我必须使用自定义排序功能,这种功能非常缓慢,导致Flash插件崩溃。
下面是自定义函数的示例代码,用于按成员的长度对数组进行排序:
private function sortByLength():int {
var x:int = arguments[0].length;
var y:int = arguments[1].length;
if (x > y){
return 1;
}else if (x < y){
return -1;
}else{
return 0;
}
}
这就是这样称呼的:
var txt:Array = ["abcde","ab","abc","a"];
txt.sort(sortByLength);
请告诉我如何更快地完成这项工作?
如何更改应用程序逻辑以避免在排序过程中Flash插件崩溃?
答案 0 :(得分:2)
尝试尽可能使用强类型,这里告诉你的函数你正在等待两个字符串。
如果您知道所有元素都不为空,那么您可以以两种方式快速重写您的函数:
function sortByLength(a:String, b:String):int {
return a.length-b.length // fastest way not comparison
}
如果你可以对它进行空检查(这个将在所有元素前放置null):
function sortByLengthWithNull(a:String, b:String):int {
if (a==null) return -1
if (b==null) return 1
return a.length-b.length
}
答案 1 :(得分:2)
如果你需要超快速排序,那么根本不使用数组而是使用链表可能是值得的。每种都有不同的优点。首先,对于链表,索引访问速度很慢,而遍历列表的速度很快,而且链表不是AS3的原生列表,所以你必须自己滚动。
从好的方面来说,您可能可以使用Polygonal Labs的一些代码:http://lab.polygonal.de/as3ds/。
对于带有链接列表的近似排序数据,排序非常非常快,如本文所述:http://lab.polygonal.de/2007/11/26/data-structures-more-on-linked-lists/。
这个解决方案为您提供了更多的工作,但最终也会为您提供更多的排序速度。
希望这有帮助。
- 额外 -
我在另一个答案的评论中注意到了你的问题“但是有一个问题没有答案 - 如何在不挂掉它的情况下在Flash中执行贪婪的计算?”
为此,基本上答案是在多个帧上打破你的计算,如下所示:
public function sort():void
{
addEventListener(Event.ENTER_FRAME, iterateSort);
}
private function iterateSort():void
{
var time:int = getTimer() + TARGET_MILLISECONDS_PER_FRAME;
var isFinished:Boolean = false;
while (!isFinished && getTimer() < time)
isFinished = continueSort();
if (isFinished)
removeEventListener(Event.ENTER_FRAME, iterateSort);
}
function continueSort():Boolean
{
... implement an 'atom of sort' here, whatever that means ...
}
答案 2 :(得分:1)
sortByLength
应该有两个参数,不应该吗?我猜你的意思是arguments
数组......
这对我来说很好,除非arguments
不是局部变量,而是一个成员变量,而你只是查看每个函数上的[0]
和[1]
元素呼叫。这至少会产生不希望的结果。