Форум 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=142055)

t4arty 11.07.2010 19:01

цикл и массив
 
Код AS3:

var a2:Array=new Array();
var a:*;
a2=[1,0,0,1]; // массив (может быть любым)
trace(a2); // трейс начального массива
for(var i:int=0;i<a2.length;i++){
        a=String(a2[i]); // присваиваем а значение и преобразуем.
        for(var ii:int=0;ii<a2.length;ii++) { // идем по-каждому символу
                if(a==String(a2[ii])) { // проверяем
                a2.splice(ii,1); удаляем значение если есть совпрадения
                }
        }
}
trace(a2); // по окончанию проверки выводим массив, переделанный ;)

ошибка или что-то еще тут содержится в строчку for(var ii:int=0;ii<a2.length;ii++) {
как ее исправить ? Потому что при выполнения условия происходит уменьшение массива, следовательно и уменьшение длинны массива.

Elff 11.07.2010 20:05

Код AS3:

var len:int = a2.length;
for(var i:int=0;i<len;i++){
...for(var ii:int=0;ii<len;ii++) {...

это имелось ввиду?
...а зачем такой странный код?

t4arty 11.07.2010 21:21

суть заключается в следующем:

два цикла взяты для того, что бы сначала взять один элемент массива и сравнить его через цикл с другими элементами массива, не понятка получается в определении длинны массива во втором цикле, так как slice метод удаляет равный элемент взятый изначально, но этого не происходит, так как меняется длинна массива в цикле, и видать когда цикл идет снова по массиву, то длинна массива сохраняется первоначальная, а не измененная условием в цикле.

вопрос, как можно изменить это? возможно, что кто-то напишет код или предложит чтонить :)

Elff 12.07.2010 01:41

нет, в вашем коде длина массива берется при каждой итерации
т.е. ход действий такой: в первой итерации первого цикла удаляются единицы, длина массива становится 2, срабатывает вторая итерация: первый 0 пропускается, т.к. i=2 и удаляется 2-ой 0. Все.
Если сделать как я написал, то все циклы сработают по 4 раза, но результат будет такой же.
Вы хотите убрать повторы? или единицы?

t4arty 12.07.2010 03:12

надо убрать повторы. вариант(листинг) который я выложил показывает в конце 0, а должен 1 и 0.

i.o. 12.07.2010 06:00

Держи
Код AS3:

var arr:Array = [ '0', '5', '0', '1', '2', '5', '1', '3', '1', '4', '4', '4' ];
 
trace( 'before: ' + arr ); // before: 0,5,0,1,2,5,1,3,1,4,4,4
 
excludeRepeats( arr );
 
trace( 'after: ' + arr ); // after: 0,5,1,2,3,4
 
 
function excludeRepeats( in_arr:Array ):void
{
        var l:int = in_arr.length;;
        var i:int = 0;
        var ii:int;
        var e:String;
        for( ; i<l; i++ )
        {
                e = in_arr[i];
 
                ii = l;
                while( --ii > i )
                {
                        if( in_arr[ii] == e )
                        {
                                in_arr.splice(ii,1);
                                l--;
                        }
                }
        }
}


alexberkut 12.07.2010 10:53

Обычно для удаления из массива, по которому бегут используют цикл в обратном порядке. Т.е. бежишь по массиву с конца
Код AS3:

for(var i:int=a2.length-1 ; i >= 0;i--)

тогда проблемы с удалением никогда не будет, ибо length не будет пересчитываться. И ты не будешь перепрыгивать через удаленные элементы.

i.o. 12.07.2010 11:23

alexberkut, вы автору темы или мне?

alexberkut 12.07.2010 11:28

Это я всем. Полезно знать.

t4arty 12.07.2010 13:32

Огромное спасибо.


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

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