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

goodguy 10.10.2011 11:43

значит maxLength не меняется
Похоже логика цикла такова:
Код AS3:

пока (максимальная длина больше нуля) {
    выполнять код.
    со вторым заходом значение максимальной длины осталось прежним, и оно по-прежнему больше нуля.
    с третьим тоже... и т.д. до бесконечности
}


Tasmanec 10.10.2011 12:10

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

 
while(maxLenght > 0) {
  for(var i:int = 0; i < myMassiv.lenght; i++) {
      if (maxLenght < myMassiv[i].lenght) {
        maxLenght = myMassiv[i].lenght;
        idArray = i;
      }                                       
  }                               
  trace(myMassiv[idArray].pop());//делаете, что надо с каким Вам нужно элементом массива с максимальной длинной это будет массив myMassiv[idArray]
myMassyv[idArray].splice(maxLenght-1, 1);                //удаляем злокачественный элемент, чтобы изменилась переменная maxLenght)               
}


GBee 10.10.2011 13:32

Код AS3:

while(maxLength > 0) { 
  maxLength--; //Длина самого длинного массива уменьшилась на 1 в предыдущей итерации.       
  for(var i:int = 0; i < myMassiv.length; i++) {
      if (maxLength < myMassiv[i].length) {
        maxLength = myMassiv[i].length;
        idArray = i;
      }                                       
  }
  if(maxLength<=0)
    break;
  trace(myMassiv[idArray].pop());//делаете, что надо с каким Вам нужно элементом массива с максимальной длинной это будет массив myMassiv[idArray]
 
}


zorexundra 10.10.2011 14:55

GBee, спасибо, что всё "разживали"!

В вышеуказанном примере сравнить быстродействие методов, предложенных Tasmanec и GBee методом Inet_PC мне не удалось, по причине противоречивых выходных данных (коды исполняються попеременно за 1 и 0 мс.).
Вместе с тем, метод GBee представляется мне более наглядным.
Также, последовательность вывода элементов массивов в двух методах отличается.

Inet_PC 10.10.2011 15:48

Цитата:

В вышеуказанном примере сравнить быстродействие методов, предложенных Tasmanec и GBee методом Inet_PC мне не удалось, по причине противоречивых выходных данных (коды исполняються попеременно за 1 и 0 мс.).
Просто при измерении нужно прогонять функцию много раз, где нить 100000, тогда примерно будет ясно who is who)

ProxyGreen 10.10.2011 16:21

Хе хе свои фокусы покусы покажу что-ли.
Так за один проход функции можно отсекать сразу несколько дочерних массивов с максимальной длинной:

Код AS3:

private function maxLengthArraySlice(arr:Array):Array {
        var retArr:Array = new Array()
        var sortObj:Object = new Object();
        var maxLen:uint = 0;
        var arrLen:uint = 0;
        var iterator:int = arr.length-1;
        while (iterator >= 0) {
                arrLen = (arr[iterator] as Array).length;
                if (!sortObj[arrLen]) sortObj[arrLen] = [],
                maxLen = Math.max(maxLen, arrLen);
                (sortObj[arrLen] as Array).push(arr[iterator]);
                iterator--;
        }
        for( var i:* in sortObj) {
                if (i != maxLen) retArr = retArr.concat(sortObj[i] as Array);
        }
        return retArr;
}

Так получать массив с массивами определённой длины:

Код AS3:

private function lengthArraySlice(arr:Array, length:uint):Array {
        var retArr:Array = [];
        var sortObj:Object = new Object();
        var arrLen:uint = 0;
        var iterator:int = arr.length-1;
        while (iterator >= 0) {
                arrLen = (arr[iterator] as Array).length;
                if (!sortObj[arrLen]) sortObj[arrLen] = [];
                (sortObj[arrLen] as Array).push(arr[iterator]);
                iterator--;
        }
        for( var i:* in sortObj) {
                if (i == length) retArr = retArr.concat(sortObj[i] as Array);//поменять == на != если нужно удалить
                //массивы опр. длинны, а не вернуть
        }
        return retArr;
}



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

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