2008-12-02 29 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」 進行排序,並無需兩臺陣列的複製合併後的數組。