1

Premesis:我正在使用带有两个数组集合的 ActionScript,其中包含要匹配的值的对象......
我需要一个解决方案(如果在框架中有一个做得更好的库),否则任何建议都会受到赞赏......

假设我有两个元素 A 和 B 列表(没有重复值),我需要比较它们并删除两者中存在的所有元素,所以最后我应该有

  • 在 A 中所有在 A 中但不在 B 中的元素
  • 在 B 中所有在 B 中但不在 A 中的元素

现在我做这样的事情:

            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 消耗更少)的方法来做到这一点......

4

1 回答 1

1

如果您必须使用列表,并且不需要arraycollection 的功能,我建议将其简单地转换为使用AS3 Vectors。与阵列相比,根据此(http://www.mikechambers.com/blog/2008/09/24/actioscript-3-vector-array-performance-comparison/)的性能提升为 60%。从我曾经读过的一些文章中,我相信 Arrays 已经比 ArrayCollections 快 3 倍。不幸的是,这个解决方案在时间上仍然是 O(n^2)。

顺便说一句,Vectors 比 ArrayCollections 更快的原因是您为 VM 提供了类型提示。VM 确切地知道集合中每个对象的大小,并据此执行优化。

向量的另一个优化是在进行比较之前先按名称对数据进行排序。如果由于排序而在列表 A 的更下方找不到列表 b 的名称,则添加另一个检查以跳出循环。

如果您想做得比这快得多,请使用关联数组(as3 中的对象)。当然,这可能需要更多的重构工作。我假设 object.nome 是对象的唯一字符串/id。只需将 nome 的值指定为 objectA 和 objectB 中的键。通过这种方式,您可能不需要遍历每个列表中的每个元素来进行比较。

于 2012-03-17T11:06:04.633 回答