Чисто объединить два массива в ActionScript (3.0)?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
22 532
5

Ответы 5

Для объединения (конкатенации) массивов используйте .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;
}

Он попросил "хороший" способ ... :)

Luke 03.12.2008 08:02

Хорошо, может быть, другой способ, который я добавил в ответ, можно было бы считать более приятным

hasseg 04.12.2008 20:04

Это своего рода простой алгоритм для написания. Я был бы удивлен, если бы в 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;
}
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);

Использование Array.indexOf для обнаружения дубликатов будет мучительно медленным, если у вас есть список, содержащий большое количество элементов; гораздо более быстрый способ удаления дубликатов - это перебросить содержимое массива в Набор после их объединения.

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

Очень аккуратно, спасибо. Ошибка в result.push[prop] tho. Должен быть result.push(prop)

chichilatte 17.07.2014 18:47

Чтобы получить ответ, выполните следующие действия:

  1. Объедините два массива с помощью методов "Concat".
  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" будет отсортирован и без дублирования объединить массив из двух массивов.

Другие вопросы по теме