Как удалить элемент во время перебора коллекции? - PullRequest
1 голос
/ 23 ноября 2010

Я хотел бы использовать синтаксис «для каждого» AS для циклического перебора коллекции элементов.В цикле мне иногда нужно удалить элемент из коллекции, над которой я перебираю.

Используя цикл «for», я бы написал такой код ( обратите внимание на оператор «-» для перемещенияindex back ):

for (var n:int=0; n<ac.length; n++) {
    var s:String = ac.getItemAt(n) as String;
    if (s == 'c')
        ac.removeItemAt(n--);
}

Можно ли сделать что-то подобное, используя конструкцию "для каждого"?

Ответы [ 4 ]

3 голосов
/ 27 ноября 2012

Скопируйте arraycollection или структуру данных. Сделайте reverse for loop на вашем оригинале и удалите элементы с нужным индексом из скопированной структуры.

Вывод: ваша новая структура данных за вычетом элементов, которые вы не хотите хранить.

3 голосов
/ 23 ноября 2010

На всех языках, которые я знаю, foreach требует, чтобы коллекция, через которую он итерируется, не менялась во время итерации.

Итак, простой ответ будет - нет, вы не можете.Но способ, которым вы делаете это в своем образце, в порядке.

edit : Что вы можете сделать, это создать новый список элементов, которые необходимо удалить внутри foreach (изitemList), а затем пройти через другой foreach (удаленных элементов) и удалить из itemList.Единственное, о чем нужно беспокоиться, это то, что вы не перебираете коллекцию, которую вы меняете.

0 голосов
/ 15 июля 2011

Это возможно с помощью for ... in loop.Итерация не прерывается.

var o:Object = { a: 0, b: 1, c:2 };
for (var k:String in o)
{
   delete o[k];
}
0 голосов
/ 23 ноября 2010

Это возможно, если конструкция for each, о которой вы говорите, разрешает доступ к индексу во время итерации, но даже в этом случае это может иметь неприятные последствия, поскольку я уверен, что большинство языков предполагают, что коллекция не будет внезапно менять свою «длину»."или его индексы во время итерации, если вы используете for each.Если вы введете индексный параметр, то вернетесь к обычной конструкции for, поэтому все упражнение окажется бесполезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...