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

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

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

Регистрация: Jul 2012
Сообщений: 44
По умолчанию Как удалить элемент из вектора в цикле?

Всем привет. В общем-то вопрос наверное простой. Но для меня, как новичка, этот момент немного напряг. Можно ли удалить элемент из вектора во время цикла по этому вектору?

Код AS1/AS2:
for each (var item:MyItem in items) {
   items.splice(items.indexOf(item), 1);
}
Получается что так делать нельзя. Но тогда как правильно?
Что делать если не все элементы нужно удалить? И если не знаешь какие надо удалять пока цикл по ним не сделаешь.

Старый 02.04.2014, 16:48
KBAC вне форума Посмотреть профиль Отправить личное сообщение для KBAC Найти все сообщения от KBAC
  № 2  
Ответить с цитированием
KBAC
 
Аватар для KBAC

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
Код AS3:
items.splice(0, items.length);
__________________
Будь проще.

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

Регистрация: Jul 2012
Сообщений: 44
я же написал:
Что делать если не все элементы нужно удалить? И если не знаешь какие надо удалять пока цикл по ним не сделаешь.

Добавлено через 1 минуту
Дело в том что при splice индексы смещаются и следующий ход цикла перескакивает через элемент.
delete тоже не подходит, так как пустой элемент все равно остается.

Старый 02.04.2014, 17:13
KBAC вне форума Посмотреть профиль Отправить личное сообщение для KBAC Найти все сообщения от KBAC
  № 4  
Ответить с цитированием
KBAC
 
Аватар для KBAC

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
Код AS3:
for (var i:int = 0; i < items.length; i++)
{
    if (checkItem(items[i])) //если нужно удалять
    {
        items.splice(i, 1);
        i--;
    }
}
__________________
Будь проще.

Старый 02.04.2014, 17:58
darkthor вне форума Посмотреть профиль Отправить личное сообщение для darkthor Найти все сообщения от darkthor
  № 5  
Ответить с цитированием
darkthor
 
Аватар для darkthor

Регистрация: Jul 2012
Сообщений: 44
Так не работает. Говорю еще раз: при splice индексы смещаются и следующий ход цикла перескакивает через элемент.

Если не понятно, получается такая ситуация:
1. В векторе 2 элемента. [0] = a, [1] = b.
2. for берет элемент [0] = a
3. splice удаляет [0] = a. Теперь [0] = b.
4. for ищет элемент [1], но такого уже нет.

В результате [1] = b вообще не был обработан.

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

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
Для этого
Код AS3:
i--;
в коде
__________________
Будь проще.

Старый 02.04.2014, 18:32
darkthor вне форума Посмотреть профиль Отправить личное сообщение для darkthor Найти все сообщения от darkthor
  № 7  
Ответить с цитированием
darkthor
 
Аватар для darkthor

Регистрация: Jul 2012
Сообщений: 44
Извиняюсь, тупанул. Попробую так. Хотя выглядит как-то немного костылёво. Спасибо.

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Вызывать каждый раз splice может быть накладно.
Вот скоростной вариант:
Код AS3:
var lenght:uint 				= items.length;
var currentIndex:uint 			= 0;
var i:uint;
var item:ItemObject;
for (i = 0; i < lenght; i++)
{
	item 					= items[i];
 
 
	// Тут производим действия над элементом
	// ...
 
	if (checkItem(items[i])) //если нужно удалять
    {
		items[i] 			= null;
        continue;
    }
 
	// Сдвиг текущих элементов в списке, если предыдущие были удалены.
	if (currentIndex != i)
	{
		items[currentIndex] = item;
		items[i] 			= null;
	}
	currentIndex++;
}
 
// Обрезание списка от отработанных элементов
if (lenght != currentIndex)
	items.length 			= currentIndex;
На основе класса Juggler (Starling)
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 04.04.2014 в 10:29.
Старый 02.04.2014, 19:56
darkthor вне форума Посмотреть профиль Отправить личное сообщение для darkthor Найти все сообщения от darkthor
  № 9  
Ответить с цитированием
darkthor
 
Аватар для darkthor

Регистрация: Jul 2012
Сообщений: 44
Интересный вариант. Спасибо. возьму на заметку для тяжелых мест. но пока у меня предполагается 3-4 элемента в векторе.

Добавлено через 4 минуты
Хочу еще добавить аргумент против вот этой конструкции:
Код AS1/AS2:
items.splice(items.indexOf(item), 1);
Если indexOf вернет -1 (элемент не найден) -- то удалится последний элемент. Что неприемлемо. Так что в таком случае все равно надо использовать if

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

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Tails Посмотреть сообщение
Вот скоростной вариант:
Код AS3:
var lenght:int = items.length;
Немного смущает размерность (тип int) свойства length. С вашей (или Даниэля?) легкой руки брюки превращаются в элегантные шорты и теряют одну степень двойки. И ставят нас в тупик отрицательными значениями при определенных условиях. Надеюсь, что вы не пишете ПО для космоса и АЭС ).
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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