Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Массив. Как удалить несколько элементов. (http://www.flasher.ru/forum/showthread.php?t=131101)

s8000_1 13.10.2009 00:12

Массив. Как удалить несколько элементов.
 
Перебираю элементы массива в цикле. И тут внезапно по какому-то условию нужно удалить элемент. И так для нескольких элементов.
Вопрос - как наиболее оптимально это сделать?

FX2000 13.10.2009 00:57

Код AS3:

private function removeObject(e:Event):void  {
myArray.splice(myArray.indexOf(e.currentTarget),1);
}

Удаляет данный объект(e.currentTarget)

s8000_1 13.10.2009 01:29

FX2000, спасибо, но я не это имел в виду. Переформулировал запрос

Lecosson 13.10.2009 02:47

Можно воспользоваться функцией filter, которая вернет новый массив, собранный из элементов фильтруемого вами по заданному критерию. Вот подробное описание на русском: http://help.adobe.com/ru_RU/AS3LCR/F...l#filter%28%29

PgeorgyV 13.10.2009 10:49

возможно оптимальнее создавать новый массив
Код AS3:

var newArray:Array = [];
var l:int = array.length;
var item:TypeArrayItems;
var j:int = 0;
for (var i:int = 0; i < l; i+=1) {
  item = array[i]; //как оптимальнее тут?
  item = array[i] as TypeArrayItems; //скорее всего так
  if(/*уловие*/) {
    newArray[j++] = item;
  }
}
array = newArray;

а ещё лучше Vector использовать, тогда и вопрос в коде снимается
здесь можно посмотреть про оптимизацию http://gskinner.com/talks/quick/
ЗЫ. В производительность filter не верю, ибо функция

Division 13.10.2009 11:23

Код AS3:

var len : int = arr.length;
var i : int = len;
while (i > 0) {
    i--;
    if (condition) {
        arr.splice(i,1);
    }
}

То есть спускаемся от последнего индекса у нулевому.
Не знаю, как флешь работает с памятью, но быть может лучше вообще не менять размер массива (обнулять удалённые элементы и сдвигать их в конец массива).

PgeorgyV 13.10.2009 11:39

Цитата:

Сообщение от Division (Сообщение 857374)
Код AS3:

var len : int = arr.length;
var i : int = len;


не понял...
Цитата:

Сообщение от Division (Сообщение 857374)
Код AS3:

arr.splice(i,1);


производительность вызова метода в as3 страдает
Цитата:

Сообщение от Division (Сообщение 857374)
Не знаю, как флешь работает с памятью, но быть может лучше вообще не менять размер массива (обнулять удалённые элементы и сдвигать их в конец массива).

с фиксированным размером лучше

Division 13.10.2009 11:51

Цитата:

не понял...
ну ладно,
Код:

i : int = arr.length;
(:
Цитата:

производительность вызова метода в as3 страдает
Так и думал. Значит, обнуляем перемещаем в конец. И храним где-то реальное количество элементов в массиве.

mayakwd 13.10.2009 23:58

Код AS3:

var i : int = arr.length;
while (i--) {
    if (condition) {
        delete arr.splice(i,1);
    }
}

массив из 12 тыс элементов обрабатывает за 30мс с учетом простого условия. не понимаю чем вам не нравится данная конструкция.

gloomyBrain 14.10.2009 00:42

Нашел пару тестов производительности actionScript'а, если кому интересно (мне было интересно):
performanceTester
Собственно, исходя из результатов тестов, думаю быстрее всего будет так:
Код AS3:

var arr:Array = new Array();
// исходные данные
// лучше Vector.<TYPE>, щас поймете почему
 
var result:Vector.<TYPE> = new Vector.<TYPE>(100, true);
// 100 элементов, неизменяемая длина
// и тип данных TYPE
 
var reference:TYPE;
// вот тут нам пригодятся исходные данные
// в виде TYPE, т.к. reference - это временная
// ссылка на элемент массива (небольшой прирост, но даст)
 
var lastNonEmpty:int = -1;
// последний ненулевой элемент в result
 
var len:uint = Array.length;
var i:uint = 0;
 
while (i < len) {
 
        reference = arr[i];
 
        if (reference  > 0) { // либо другое Ваше условие для reference                       
                lastNonEmpty += 1;
                result[lastNonEmpty] = reference;                       
        }
 
        i += 1; // шагаем к следующему элементу
}

Я не утверждаю что это единственно-верный способ, но должно быть быстрее splice'ов полюбому

PS
1) Количество элементов в result можно поставить равным максимально возможной длине arr (на случай, если все элементы пройдут фильтр успешно)
2) result можно (и нужно) создать заранее и использовать несколько раз
3) если Вам фильтровать 5 значений... =) забудьте о написанном выше

incoob 14.10.2009 02:27

Интересная ссылка. Сразу вспомнилось http://docs.google.com/present/view?...rvds_0hjb794hr.

А вообще, было бы очень здорово, если бы кто-нибудь собрал подобные рекомендации по увеличению производительности и выложил их, например, в faq.


Часовой пояс GMT +4, время: 20:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.