AS3 Удаление элементов из массива без изменения положения - PullRequest
2 голосов
/ 15 ноября 2011

Я хочу написать функцию, которая удаляет элементы из массива целых чисел, начиная с самых низких значений, без изменения позиций элементов.Язык программирования - ActionScript3.

например (это отдельные операторы трассировки)

    var aNumArr:Array = [0,7,2,5,9,0]
    trace(RemoveMinValues(aNumArr, 1, false)) //output: 7,2,5,9,0
    //trace(RemoveMinValues(aNumArr, -1, true)) //output: 0,7,2,5,9
    //trace(RemoveMinValues(aNumArr, 2)) //output: 7,2,5,9

Мне удалось удалить самые низкие значения в массиве, используя sort(Array.NUMERIC) и sort(Array.DESCENDING).

Но я не могу понять, как переместить элементы обратно в исходное положение.

Поскольку это назначение , я не могу скопировать весь код функции.И я хотел бы, чтобы вы не сказали мне точный ответ, а дали мне представление о том, как это сделать.

Надеюсь, я был достаточно ясен.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Заранее спасибо.


РЕДАКТИРОВАТЬ: я понял, что упустил несколько вещей из функции.Я также изменил aNumArr и желаемые выходные значения, чтобы сделать его более понятным, чем я хочу.

И вот что я делал ранее:

    function RemoveMinValues(aNumArr:Array, iMinsToRemove:int):void
    {
         if(iMinsToRemove >= 0)
         {
              aNumArr.sort(Array.NUMERIC);
              for(var i:int = 0; i < iMinsToRemove; ++i)
              {
                   aNumArr.shift();
              }
         }
         else
         {
              aNumArr.sort(Array.DESCENDING);
              for(var i:int = 0; i > iMinsToRemove; --i)
              {
                   aNumArr.pop();
              }
         }
    }

В основном aNumArr:Array этоуказан массив целых чисел.И iNumbersOfMinsToRemove:int - это количество минимальных значений для удаления.Назначение требует, чтобы я возвратил Ничего .

Я знаю, что Array.NUMERIC и Array.DESCENDING изменили бы положение элементов, но я не могу понять, как логическисохранить свои позиции.Пожалуйста, постарайтесь сделать как можно более простым.Я все еще аппетит.

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Вместо удаления значения установите его на null. Более того, установите его на Math.NEGATIVE_INFINITY, чтобы порядок сортировки не изменился.

Таким образом, индексы массива останутся прежними, потому что вы изменяете значение, а не удаляете это

0 голосов
/ 16 ноября 2011

[[Редактировать]]

Добавил код в блок спойлера для других.


Если я правильно понимаю ваш вопрос, вы хотите исследовать Array.filter.Если задаваемый вопрос требует, чтобы конечный результат каждого прохода RemoveMinValues ​​возвращал массив, в котором сохраняется относительная, а не абсолютная позиция, тогда метод фильтра будет работать лучше всего.

Вот разница с учетом следующего массивапри условии, что вторым аргументом RemoveMinValues ​​является минимальное значение, по умолчанию 0. 0. 1010 *

var arr:Array = [-1,3,2,1,0];

Абсолютная позиция:

RemoveMinValues(arr)    // [null,3,2,1,null]
RemoveMinValues(arr, 1) // [null,3,2,null,null]

Относительная позиция:

RemoveMinValues(arr)    // [3,2,1]
RemoveMinValues(arr, 1) // [3,2]

следующая реализация метода для RemoveMinValues ​​даст "относительные" результаты.Пожалуйста, потратьте некоторое время на чтение Array.filter документации.Каждый вызов RemoveMinValues ​​в этой конкретной реализации возвращает новый массив без изменения оригинала, как определено в документации.

Код:

Этот метод будет медленнее для больших наборов данных.Переключение на объект Vector может решить проблемы с производительностью.

Удачи!

0 голосов
/ 15 ноября 2011

Во-первых, обратите внимание, что Math.min () и Math.max () могут принимать любое количество аргументов. Также важно понимать метод apply (), доступный для объектов Function. Это позволяет передавать аргументы в функцию, используя массив. Давайте воспользуемся преимуществом обоих:

var aNumArr:Array = [0,7,2,5,9];
var maxValue:Number = Math.max.apply(null, aNumArr);
var minValue:Number = Math.min.apply(null, aNumArr);

Вот лучшая часть: «цикл» фактически выполняется с использованием собственного кода (внутри Flash Player), поэтому он быстрее, чем поиск минимального или максимального значения с использованием чистого цикла ActionScript.

...