2008-12-02 23 views

回答

25

要合并(连接)数组,请使用.concat()

下面是如何连接数组并同时删除重复项的两个示例。

更方便的方法:(你可以使用ArrayUtil.createUniqueCopy()as3corelib

// 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; 
} 
+0

他问了一个'很好'的方式......:) – Luke 2008-12-03 05:02:23

+0

好吧,也许我添加到答案的其他方式可以被认为是'更好' – hasseg 2008-12-04 17:04:59

4

这是一种简单的算法来编写。如果在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; 
} 
2
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); 
3

使用Array.indexOf检测重复是怎么回事,如果你有一个包含大量元素的清单是非常慢的;删除duplciates的更快的方法是在将它们连接起来后将数组的内容放入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]; 
} 

如果你的程序使用了大量的馆藏那么如果可以谨慎地使许多AS3收藏之一的使用框架存在其用于操纵数据提供了一个简单的界面,当它始终以最佳方法来实现。

0

请按照下面的步骤让你的答案:

  1. 的毗连×2个阵列使用 “的毗连” Methos。
  2. 新阵列(concated)排序使用“排序”方法,该方法在阵列级提供为API
  3. 制作用户定义函数来删除重复(见下文函数)
  4. >功能removeDuplicates(p_arr:阵列):数组{
    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” 进行排序,并无需两台阵列的复制合并后的数组。