Чисто объединить два массива в ActionScript (3.0)? - PullRequest
17 голосов
/ 02 декабря 2008

Какой хороший способ объединить два отсортированных массива в ActionScript (в частности, ActionScript 3.0)? Полученный массив должен быть отсортирован и без дубликатов.

Ответы [ 5 ]

25 голосов
/ 03 декабря 2008

Чтобы объединить (объединить) массивы, используйте .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;
}
4 голосов
/ 10 декабря 2008

Это простой алгоритм для написания. Я был бы удивлен, если бы был более прямой способ сделать это в 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 голосов
/ 21 мая 2011

Использование 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 Коллекции, которые предоставляют простой интерфейс для манипулирования данными и всегда будут придерживаться оптимального подхода при реализации .

2 голосов
/ 21 декабря 2010
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);
0 голосов
/ 28 ноября 2011

Пожалуйста, следуйте инструкциям ниже, чтобы получить ответ:

  1. Конкат два массива с использованием "Конкат" Метос.
  2. Новая сортировка массива (конкатенация) с использованием метода «Сортировка», который предоставляется как 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» будет отсортирован без дублированного объединенного массива из двух массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...