在 ActionScript (3.0) 中干净地合并两个数组?
Posted
技术标签:
【中文标题】在 ActionScript (3.0) 中干净地合并两个数组?【英文标题】:Cleanly merge two arrays in ActionScript (3.0)? 【发布时间】:2010-09-25 00:34:42 【问题描述】:在 ActionScript(特别是 ActionScript 3.0)中合并两个排序数组的好方法是什么?生成的数组应该排序并且没有重复。
【问题讨论】:
【参考方案1】:要合并(连接)数组,请使用.concat()
。
以下是如何连接数组并同时删除重复项的两个示例。
更便捷的方式:(可以使用as3corelib中的ArrayUtil.createUniqueCopy()
)
// from as3corelib:
import com.adobe.utils.ArrayUtil;
var a1:Array = ["a", "b", "c"];
var a2:Array = ["c", "b", "x", "y"];
var c:Array = ArrayUtil.createUniqueCopy(a1.concat(a2)); // result: ["a", "b", "c", "x", "y"]
稍微快一点的方法:(您可以自己循环遍历数组并使用Array.indexOf()
来检查重复项)
var a1:Array = ["a", "b", "c"];
var a2:Array = ["c", "b", "x", "y"];
var a3:Array = ["a", "x", "x", "y", "z"];
var c:Array = arrConcatUnique(a1, a2, a3); // result: ["a", "b", "c", "x", "y", "z"]
private function arrConcatUnique(...args):Array
var retArr:Array = new Array();
for each (var arg:* in args)
if (arg is Array)
for each (var value:* in arg)
if (retArr.indexOf(value) == -1)
retArr.push(value);
return retArr;
【讨论】:
他要求一个“好”的方式... :) 好的,也许我添加到答案中的另一种方式可以被认为是“更好”【参考方案2】:这是一种简单的算法。如果在 Actionscript 中有更直接的方法可以做到这一点,我会感到惊讶。
function merge(a1:Array, a2:Array):Array
var result:Array = [];
var i1:int = 0, i2:int = 0;
while (i1 < a1.length && i2 < a2.length)
if (a1[i1] < a2[i2])
result.push(a1[i1]);
i1++;
else if (a2[i2] < a1[i1])
result.push(a2[i2]);
i2++;
else
result.push(a1[i1]);
i1++;
i2++;
while (i1 < a1.length) result.push(a1[i1++]);
while (i2 < a2.length) result.push(a2[i2++]);
return result;
【讨论】:
【参考方案3】:function remDuplicates(_array:Array):void
for (var i:int = 0; i < _array.length;++i)
var index:int = _array.indexOf(_array[i]);
if (index != -1 && index != i)
_array.splice(i--, 1);
然后对于“合并”使用 concat。 例子:
var testArray:Array = [1, 1, 1, 5, 4, 5, 5, 4, 7, 2, 3, 3, 6, 5, 8, 5, 4, 2, 4, 5, 1, 2, 3, 65, 5, 5, 5, 5, 8, 4, 7];
var testArray2:Array = [1, 1, 1, 5, 4, 5, 5, 4, 7, 2, 3, 3, 6, 5, 8, 5, 4, 2, 4, 5, 1, 2, 3, 65, 5, 5, 5, 5, 8, 4, 7];
testArray.concat(testArray2);
trace(testArray);
remDuplicates(testArray);
trace(testArray);
【讨论】:
【参考方案4】:如果您有一个包含大量元素的 List,使用 Array.indexOf 检测重复项将会非常缓慢;删除重复项的一种更快的方法是在连接它们之后将 Array 的内容放入 Set 中。
// Combine the two Arrays.
const combined : Array = a.concat(b);
// Convert them to a Set; this will knock out all duplicates.
const set : Object = ; // use a Dictionary if combined contains complex types.
const len : uint = combined.length;
for (var i : uint = 0; i < len; i++)
set[combined[i]] = true;
// Extract all values from the Set to produce the final result.
const result : Array = [];
for (var prop : * in set)
result.push[prop];
如果您的程序大量使用 Collections,那么使用众多 AS3 Collections 框架之一可能是明智的,这些框架提供了一个简单的接口来操作数据,并且在实现时总是采用最佳方法.
AS3Commons Collections Polygonal DS【讨论】:
非常整洁,谢谢。result.push[prop]
的错误。应该是result.push(prop)
【参考方案5】:
请按照以下步骤获取答案:
-
使用“Concat”方法连接两个数组。
使用数组类中作为 API 提供的“排序”方法的新数组(连接)排序
制作用户定义的函数以删除重复项(见下面的函数)
> 函数 removeDuplicates(p_arr:Array):Array
var ansArr:Array = new Array(); var len:uint = p_arr.length; var i:uint = 0; var j:uint = 0; ansArr[j] = p_arr[i]; i++; j++; while(i<len) if(ansArr[j] != p_arr[i]) ansArr[j] = p_arr[i]; j++; i++; return ansArr;
返回的 "ansArr" 将被排序并且没有重复的两个数组的合并数组。
【讨论】:
以上是关于在 ActionScript (3.0) 中干净地合并两个数组?的主要内容,如果未能解决你的问题,请参考以下文章