Алгоритм стека массивов без копирования

У меня есть приложение flashlite3 с навигацией, состоящей из значков, которые пользователь может просматривать влево или вправо бесконечно.

Основной алгоритм, который я сейчас использую, работает (и подходит для этого проекта), однако, часть решения зависит от дубликата массива значков. В зависимости от количества элементов в массиве и / или размера содержимого элемента это решение может стать менее эффективным. Я заинтересован в решении или алгоритме (на любом языке), который может достичь того же результата, будучи масштабируемым и эффективным.

Вот часть соответствующего кода в функции установки для изменения свойства _selectedItem, которое:

  1. Оценивает текущий _selectedItem и новое _value
  2. В зависимости от шага 1 pop,unsifts вправо или shift, щелкает влево
  3. Повторите шаг 2, пока значок, соответствующий _selectedItem, не окажется в центре массива

Этот код выполняется с использованием 3 массивов:

  1. [статические] Массив позиций. Есть 5 значков, 3 видны одновременно, поэтому позиция 0 находится вне сцены, позиция 1 - 1/3, позиция 2 - 1/2 .
  2. При создании экземпляров иконок создаются 2 массива: _viewArray & _icons. Порядок _viewArray имитирует порядок отображения, а _icons оставлен в покое и используется для проверки состояния цикла

/// ///ActionScript2

    public function set selectedItem(value:Number)
    {
        var w=Stage.width;

        if(value > _icons.length-1)
        {
            value=0;
        }else if(value < 0)
        {
            value=_icons.length-1;
        }

        if(value > _selectedIndex)
        {
            while(_viewArray[Math.floor(_icons.length*.5)] != _icons[value])
            {
                var element;
                element=_viewArray.pop();
                _viewArray.unshift(element);
            }
        }else if(value < _selectedIndex)
        {
            while(_viewArray[Math.floor(_icons.length*.5)]!=_icons[value])
            {
                var element;
                element=_viewArray.shift();
                _viewArray.push(element);
            }           
        }




        for(var i:Number=0;i<_viewArray.length;i++)
        {
            if(i>=1 && i<= _icons.length-2)
            {
                _viewArray[i]._visible=true;
            }else
            {
                _viewArray[i]._visible=false;
            }
            Tweener.addTween(_viewArray[i],{_x:positions[i],_alpha:80,time:.5,transition:'elasticIn'})
        }


        Tweener.addTween(_icons[(_viewArray.length*.5)-1],{_alpha:100,time:.0,transition:'elasticIn'});
        Tweener.addTween(_selectedServiceIndicator,{_alpha:0,time:.3,transition:'elasticIn',onComplete:function() {Tweener.addTween(this,{_alpha:100,time:.2,transition:'elasticIn'});}});

        var eventObject:Object = {target:this, type:'SelectedItemChange'};
        eventObject.value=value;

        for(var key in _serviceData[value])
        eventObject[key]=_serviceData[value][key];

        dispatchEvent(eventObject);
        _selectedIndex=value;
    }

1 ответ

Решение

Почему каждый элемент _viewArray должен хранить иконку, а не только индекс в массиве _icons? Таким образом, значки сохраняются только один раз, а _viewArray просто сохраняет их порядок представления.

Другие вопросы по тегам