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

djyamato 25.09.2011 00:34

Закольцованная выборка нескольких элементов из массива
 
Есть массив 1,2,3,4,5,6,7,8
Нужно по таймеру (или еще как-то) выбирать из него по несколько элементов, допустим, по 3

Можно ли как-то оптимизировать этот код, или вообще, проще сделать ?

Код AS3:

import flash.utils.Timer;
import flash.events.TimerEvent;
 
var data:Array=[0,1,2,3,4,5,6,7];
var tickItems:int=3;
 
var counter:int=0;
 
var timer:Timer=new Timer(1000);
timer.start();
timer.addEventListener(TimerEvent.TIMER,timerHandler);
 
function timerHandler(event:TimerEvent):void
{
        var i:int;
        var items:Array=new Array();
        var startPos:int=counter;
        counter+=tickItems;
        if(counter>data.length)
        {
                var razn=Math.abs(counter-data.length);
                for(i=startPos;i<data.length;i++)
                {
                        items.push(data[i]);
                }
                for(i=0;i<razn;i++)
                {
                        items.push(data[i]);
                }
                counter=razn;
        }
        else
        {
                for(i=startPos;i<startPos+tickItems;i++)
                {
                        items.push(data[i]);
                }
        }
        trace(items);
}


iNils 25.09.2011 02:08

Код AS3:

import flash.utils.Timer;
import flash.events.TimerEvent;
 
var data:Array = [0,1,2,3,4,5,6,7];
var tickItems:int = 3;
 
var counter:int = 0;
 
var timer:Timer = new Timer(1000);
timer.start();
timer.addEventListener(TimerEvent.TIMER,timerHandler);
 
function timerHandler(event:TimerEvent):void {
        var data2:Array = data.concat(data);
        var items:Array = [];
        items = data2.slice(counter,counter + 3);
        if (counter >= data.length) {
                counter -= data.length;
        }
        counter +=  tickItems;
        trace(items);
}


djyamato 25.09.2011 02:11

Спасибо

P.S. Ошибается алгоритмик :(

tickItems = 5

Код:

0,1,2,3,4
5,6,7,0,1
2,3,4,5,6
7,0,1,2,3
4,5,6,7
1,2,3,4,5
6,7,0,1,2
3,4,5,6,7
0,1,2,3,4
5,6,7,0,1
2,3,4,5,6
7,0,1,2,3
4,5,6,7
1,2,3,4,5


silin 25.09.2011 11:51

Код AS3:

function timerHandler(event:TimerEvent):void
{
        var items:Array = data.slice(0, tickItems)
        trace( "items : " + items );
        for (var j:int = 0; j < tickItems; j++)
        {
                data.push(data.shift());
        }
}

Добавлено через 10 минут
Код AS3:

function timerHandler(event:TimerEvent):void
{
        var items:Array = data.splice(0, tickItems);
        trace( "items : " + items );
        data=data.concat(items);
}


ProxyGreen 25.09.2011 13:19

Мой вариант:
Код AS3:

 
var counter:int = 0;
var step:int = 5;
var arr:Array = [1, 2, 3, 4, 5, 6];
 
public function timerHandler(e:TimerEvent):void {
 var current_part:Array = getArrayElemnts(arr, step, counter);
 trace('items(' + current_part.length + '): [' + current_part + ']');
 counter = (counter + step) % arr.length;
}
 
public function getArrayElemnts(array:Array, num:uint, pos:int):Array {
        var result:Array = new Array();
        var correction:int = array.length * Math.abs((Math.ceil(pos / array.length)))+1;
        while (num > 0) {
                result.unshift(array[((correction+pos + num-1) % array.length)]);
                num--;
        }
        return result;
 
}

Можно задавать отрицательные позиции.

wvxvw 25.09.2011 13:23

Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author wvxvw
        */

        public class CircularArray extends Sprite
        {
                private var _cursor:int;
 
                private var _step:uint = 4;
 
                private const _sequence:Array = [1, 2, 3, 4, 5, 6, 7];
 
                private const _elements:Array = new Array(3);
 
                public function CircularArray()
                {
                        super();
                        for (var i:int = 13; i > 0; i--) this.rotate();
                }
 
                private function rotate(event:Event = null):void
                {
                        this._cursor = (this._cursor + this._step) % this._sequence.length;
                        for (var i:int; i < this._elements.length; i++)
                        {
                                this._elements[i] =
                                        this._sequence[(i + this._cursor) % this._sequence.length];
                        }
                        trace(this._elements);
                }
        }
}

Еще вариант, без того, чтобы создавать вспомогательные массивы и с возможностью ротации на число позиций отличное от количества элементов, которые требуется получить в на каждой ротации. + счетчик циклов можно оптимизировать, т.как он сравнивет с константой величиной.

Zebestov 25.09.2011 14:07

Был еще такой вариант

i.o. 25.09.2011 16:08

Код AS3:

for (var i:int=-8; i<8; i++)
        trace(i + " : " + toCycled(i));
 
function toCycled( val:int, len:uint=5 ) : uint
{
        return (len + val % len) % len;
}

Код:

-8 : 2
-7 : 3
-6 : 4
-5 : 0
-4 : 1
-3 : 2
-2 : 3
-1 : 4
0 : 0
1 : 1
2 : 2
3 : 3
4 : 4
5 : 0
6 : 1
7 : 2


Zebestov 25.09.2011 17:24

i.o., хорошо упаковал! Интересно, как со скоростью:quiet:

i.o. 25.09.2011 17:54

ну, полагаю, математика быстрее условий :)


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

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