Какой хороший способ объединить два отсортированных массива в ActionScript (в частности, ActionScript 3.0)? Результирующий массив должен быть отсортирован и без дубликатов.Чистое объединение двух массивов в ActionScript (3.0)?
ответ
Чтобы объединить (объединить) массивы, используйте .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;
}
Это своего рода простой алгоритм для написания. Я был бы удивлен, если бы был более прямой способ сделать это в 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. 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);
Использование 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 коллекций каркасов там, которые обеспечивают простой интерфейс для манипулирования данных и всегда будет оптимальный подход, когда его приходит к реализации.
Пожалуйста, следуйте ниже шаг, чтобы получить ответ на свой вопрос:
- Concat два массива с использованием "Concat" Митос.
- New Array (concated) сортировки, используя метод "Сортировка", который предоставляется в качестве API в массиве класса
- Сделать определенную пользователем функцию, чтобы удалить дубликаты (см ниже функций)
- > Функция 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" будут отсортированы и без дубликатов присоединяемого массива из двух массива.
Он попросил «хороший» способ ...:) – Luke 2008-12-03 05:02:23
Хорошо, может быть, другой способ, который я добавил в ответ, можно было бы считать «лучше» – hasseg 2008-12-04 17:04:59