2008-12-02 10 views

Respuesta

25

Para fusionar (concatenar) matrices, use .concat().

A continuación hay dos ejemplos de cómo puede concatenar matrices y eliminar duplicados al mismo tiempo.

manera más conveniente: (puede usar ArrayUtil.createUniqueCopy() de 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"] 

manera un poco más rápido: (se puede recorrer las matrices de sí mismo y utilizar Array.indexOf() para comprobar si hay duplicados)

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

Pidió una "buena" manera ...:) – Luke

+0

Ok, tal vez la otra forma en que agregué la respuesta podría considerarse 'mejor' – hasseg

+0

Gracias, funcionó a las mil maravillas. –

4

Este es un tipo de algoritmo simple para escribir. Me sorprendería si hubiera una manera más directa de hacer esto en 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); 
     } 
    } 
} 

Luego de la "fusión" concat uso. Ejemplo:

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

Uso Array.indexOf para detectar duplicados va a ser muy lento si usted tiene una lista que contiene un gran número de elementos; una forma mucho más rápida de eliminar duplicados sería arrojar los contenidos de la matriz en un Set después de concatenarlos.

// 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]; 
} 

Si el programa hace un uso intensivo de Colecciones entonces, si puede ser prudente hacer uso de una de las muchas colecciones de AS3 marcos por ahí que proporcionan una interfaz sencilla para la manipulación de datos y siempre tendrá el enfoque óptimo cuando se viene a la implementación.

+0

Muy limpio, gracias. Error en 'result.push [prop]' tho. Debería ser 'result.push (prop)' – chichilatte

0

Por favor, siga el paso siguiente para obtener su respuesta:

  1. de concatenación de dos matriz utilizando "de concatenación" Methos.
  2. New Array (concated) especie utilizando el método de "Ordenar", que proporciona como API en clase Array
  3. usuario
  4. Hacer una función definida para eliminar duplicados (véase más adelante funciones)
  5. > RemoveDuplicates función (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; 
    

    }

devuelto "ansArr", serán ordenados y sin array resultante duplicado de dos matriz.

Cuestiones relacionadas