Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.10.2009, 00:12
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 1  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
Question Массив. Как удалить несколько элементов.

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


Последний раз редактировалось s8000_1; 13.10.2009 в 01:28.
Старый 13.10.2009, 00:57
FX2000 вне форума Посмотреть профиль Отправить личное сообщение для FX2000 Найти все сообщения от FX2000
  № 2  
Ответить с цитированием
FX2000

Регистрация: Sep 2009
Сообщений: 39
Код AS3:
private function removeObject(e:Event):void  {
myArray.splice(myArray.indexOf(e.currentTarget),1);
}
Удаляет данный объект(e.currentTarget)


Последний раз редактировалось iNils; 13.10.2009 в 11:12.
Старый 13.10.2009, 01:29
s8000_1 вне форума Посмотреть профиль Отправить личное сообщение для s8000_1 Найти все сообщения от s8000_1
  № 3  
Ответить с цитированием
s8000_1
 
Аватар для s8000_1

Регистрация: Jun 2007
Сообщений: 374
FX2000, спасибо, но я не это имел в виду. Переформулировал запрос

Старый 13.10.2009, 02:47
Lecosson вне форума Посмотреть профиль Отправить личное сообщение для Lecosson Найти все сообщения от Lecosson
  № 4  
Ответить с цитированием
Lecosson

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

Старый 13.10.2009, 10:49
PgeorgyV вне форума Посмотреть профиль Отправить личное сообщение для PgeorgyV Найти все сообщения от PgeorgyV
  № 5  
Ответить с цитированием
PgeorgyV

Регистрация: Apr 2008
Сообщений: 79
возможно оптимальнее создавать новый массив
Код 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 не верю, ибо функция

Старый 13.10.2009, 11:23
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 6  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Код AS3:
var len : int = arr.length;
var i : int = len;
while (i > 0) {
    i--;
    if (condition) {
        arr.splice(i,1);
    }
}
То есть спускаемся от последнего индекса у нулевому.
Не знаю, как флешь работает с памятью, но быть может лучше вообще не менять размер массива (обнулять удалённые элементы и сдвигать их в конец массива).
__________________
while(1) {}

Старый 13.10.2009, 11:39
PgeorgyV вне форума Посмотреть профиль Отправить личное сообщение для PgeorgyV Найти все сообщения от PgeorgyV
  № 7  
Ответить с цитированием
PgeorgyV

Регистрация: Apr 2008
Сообщений: 79
Цитата:
Сообщение от Division Посмотреть сообщение
Код AS3:
var len : int = arr.length;
var i : int = len;
не понял...
Цитата:
Сообщение от Division Посмотреть сообщение
Код AS3:
arr.splice(i,1);
производительность вызова метода в as3 страдает
Цитата:
Сообщение от Division Посмотреть сообщение
Не знаю, как флешь работает с памятью, но быть может лучше вообще не менять размер массива (обнулять удалённые элементы и сдвигать их в конец массива).
с фиксированным размером лучше

Старый 13.10.2009, 11:51
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 8  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Цитата:
не понял...
ну ладно,
Код:
i : int = arr.length;
(:
Цитата:
производительность вызова метода в as3 страдает
Так и думал. Значит, обнуляем перемещаем в конец. И храним где-то реальное количество элементов в массиве.
__________________
while(1) {}

Старый 13.10.2009, 23:58
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 9  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
Код AS3:
var i : int = arr.length;
while (i--) {
    if (condition) {
	delete arr.splice(i,1);
    }
}
массив из 12 тыс элементов обрабатывает за 30мс с учетом простого условия. не понимаю чем вам не нравится данная конструкция.

Старый 14.10.2009, 00:42
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 10  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Нашел пару тестов производительности 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 значений... =) забудьте о написанном выше
__________________
...вселенская грусть


Последний раз редактировалось gloomyBrain; 14.10.2009 в 02:54. Причина: вылизал код=)
Создать новую тему Ответ Часовой пояс GMT +4, время: 18:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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