Premesis:
我正在使用带有两个arraycollections的ActionScript,其中包含要匹配值的对象...
我需要一个解决方案(如果在框架中有一个更好的库),否则任何建议都会受到赞赏......
假设我有两个元素A和B列表(没有重复值),我需要比较它们并删除两者中存在的所有元素,所以最后我应该
现在我做了类似的事情:
for (var i:int = 0 ; i < a.length ;)
{
var isFound:Boolean = false;
for (var j:int = 0 ; j < b.length ;)
{
if (a.getItemAt(i).nome == b.getItemAt(j).nome)
{
isFound = true;
a.removeItemAt(i);
b.removeItemAt(j);
break;
}
j++;
}
if (!isFound)
i++;
}
我循环两个数组,如果找到匹配项,我会从两个数组中删除项目(并且不要增加循环值,以便for
循环以正确的方式进行)
我想知道是否(并且我确定有)更好(并且耗费更少CPU)的方式来做...
答案 0 :(得分:1)
如果你必须使用一个列表,并且你不需要arraycollection的能力,我建议简单地将它转换为使用AS3 Vectors。与Arrays相比,根据此(http://www.mikechambers.com/blog/2008/09/24/actioscript-3-vector-array-performance-comparison/)的性能提升为60%。我相信Arrays已经比我曾读过的一篇文章中的ArrayCollections快3倍。不幸的是,这个解决方案仍然是O(n ^ 2)。
另外,Vector比ArrayCollections更快的原因是因为你为VM提供了类型提示。 VM确切地知道每个对象在集合中的大小,并基于此进行优化。
向量的另一个优化是在进行比较之前首先由nome对数据进行排序。如果由于排序而无法在列表A中找到列表b的nome,则添加另一个检查以突破循环。
如果你想比那更快,请使用关联数组(as3中的对象)。当然,这可能需要更多的重构努力。我假设object.nome是对象的唯一字符串/ id。只需将nome的值指定为objectA和objectB中的键即可。通过这种方式,您可能不需要遍历每个列表中的每个元素来进行比较。