2008-12-02 2 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. Exemple:

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 для обнаружения дубликатов будет мучительно медленным, если у вас есть список, содержащий большое количество элементов; гораздо более быстрый способ удаления дубликатов - это бросить содержимое массива в 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. Concat два массива с использованием "Concat" Митос.
  2. New Array (concated) сортировки, используя метод "Сортировка", который предоставляется в качестве API в массиве класса
  3. Сделать определенную пользователем функцию, чтобы удалить дубликаты (см ниже функций)
  4. > Функция 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" будут отсортированы и без дубликатов присоединяемого массива из двух массива.

 Смежные вопросы

  • Нет связанных вопросов^_^