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

@salathe Для тех из вас, кто с трудом понимает, что делает usort salathe:

Каждый элемент в $ массиве является «чемпионом» в турнире, который должен быть в начале нового array (кроме вместо номера один они хотят быть числом 0).

$ a является домашним чемпионом, а $ b противником в матче.

$ pos_a и $ pos_b от обратного вызова - какие атрибуты будут использоваться в борьбе за чемпионов a и b. В этом случае этот атрибут является индексом идентификатора чемпиона в $ order.

Затем идет бой по возвращении. Теперь мы посмотрим, лучше ли более или менее атрибут. В битве за битву домашний чемпион хочет отрицательное число, поэтому он может быть скорее в массиве. Выездной чемпион хочет получить положительное число. И должно быть 0, это галстук.

Итак, следуя этой аналогии, когда атрибут «Чемпионы» (индекс в $ order) вычитается из атрибута home teams, чем больше атрибут «away», тем меньше вероятность выиграть, получив положительное число. Однако, если вы изменили способ использования атрибутов, теперь атрибут домашнего чемпиона вычитается из игры чемпиона. В этом случае большее число для чемпиона в гостях с большей вероятностью заставит его иметь конец конца в положительном числе.

Код будет выглядеть так:

note: код запускается многими раз, как настоящий турнир, имеет много битв, чтобы решить, кто первым (т. е. 0 / начало массива)

//tournament with goal to be first in array
    usort($champions, function ($home, $away) use ($order) {
        $home_attribute = array_search($a['id'], $order);
        $away_attribute = array_search($b['id'], $order);
        //fight with desired outcome for home being negative and away desiring positive
        return $home_attribute - $away_attribute;
    });
17
задан mellis 2 December 2008 в 20:44
поделиться

2 ответа

Для слияния (связывают) массивы, используют .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;
}
25
ответ дан 30 November 2019 в 12:01
поделиться

Это - вид простого алгоритма для записи. Я был бы удивлен, был ли более прямой способ сделать это в 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;
}
4
ответ дан 30 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: