![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
Перебираю элементы массива в цикле. И тут внезапно по какому-то условию нужно удалить элемент. И так для нескольких элементов.
Вопрос - как наиболее оптимально это сделать? Последний раз редактировалось s8000_1; 13.10.2009 в 01:28. |
|
|||||
|
Регистрация: Sep 2009
Сообщений: 39
|
Удаляет данный объект(e.currentTarget)
Последний раз редактировалось iNils; 13.10.2009 в 11:12. |
|
|||||
|
Регистрация: Jun 2007
Сообщений: 374
|
FX2000, спасибо, но я не это имел в виду. Переформулировал запрос
|
|
|||||
|
Можно воспользоваться функцией filter, которая вернет новый массив, собранный из элементов фильтруемого вами по заданному критерию. Вот подробное описание на русском: http://help.adobe.com/ru_RU/AS3LCR/F...l#filter%28%29
|
|
|||||
|
Регистрация: Apr 2008
Сообщений: 79
|
возможно оптимальнее создавать новый массив
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; здесь можно посмотреть про оптимизацию http://gskinner.com/talks/quick/ ЗЫ. В производительность filter не верю, ибо функция |
|
|||||
var len : int = arr.length; var i : int = len; while (i > 0) { i--; if (condition) { arr.splice(i,1); } } Не знаю, как флешь работает с памятью, но быть может лучше вообще не менять размер массива (обнулять удалённые элементы и сдвигать их в конец массива).
__________________
while(1) {} |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 79
|
не понял...
производительность вызова метода в as3 страдает с фиксированным размером лучше |
|
|||||
|
Цитата:
Цитата:
__________________
while(1) {} |
|
|||||
|
массив из 12 тыс элементов обрабатывает за 30мс с учетом простого условия. не понимаю чем вам не нравится данная конструкция.
|
|
|||||
|
Нашел пару тестов производительности actionScript'а, если кому интересно (мне было интересно):
performanceTester Собственно, исходя из результатов тестов, думаю быстрее всего будет так: 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; // шагаем к следующему элементу } PS 1) Количество элементов в result можно поставить равным максимально возможной длине arr (на случай, если все элементы пройдут фильтр успешно) 2) result можно (и нужно) создать заранее и использовать несколько раз 3) если Вам фильтровать 5 значений... =) забудьте о написанном выше
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 14.10.2009 в 02:54. Причина: вылизал код=) |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:05. |
|
|
« Предыдущая тема | Следующая тема » |
|
|