Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Перебор массива по 3 элемента (http://www.flasher.ru/forum/showthread.php?t=168613)

in4core 22.09.2011 17:02

Перебор массива по 3 элемента
 
Есть 3 текстовых поля, идущих друг за другом.
Есть массив [1,3,5,6,9,12,55....]
Есть кнопки перемотки вперед-назад.

Подскажите как лучше всего организовать следующее :
Изначально в поля помещаются индексы массива [0],[1],[2] соотв. Если нажать вперед то [n][0][1] , еще раз [n-1][n][0] и т.д. Если нажать назад, [1][2][3], [2][3][4] и т.д.

Zebestov 22.09.2011 18:35

Цикличность тебе штоле нужно организовать?

Код AS3:

private function getIndex(i:int):int
{
    var l:int = this._myArray.length;
    i = i % l;
    i = i < 0 ? l + i : i;
    return i;
}

Этот метод при любом значении i будет выдавать корректный индекс массива с учетом цикличности. Просто подаешь ему по очереди i, i+1, i+2. Изначально i=0. Потом -- его при "вперед" и ++ при "назад".

silin 22.09.2011 18:43

Код AS3:

arr.unshift(arr.pop());// вперед
arr.push(arr.shift());// назад


in4core 22.09.2011 18:53

Спасибо ребята интересные варианты

djyamato 09.10.2011 08:18

Цитата:

Сообщение от Zebestov (Сообщение 1033790)
Этот метод при любом значении i будет выдавать корректный индекс массива с учетом цикличности

Клевая кабалистика, а главное, работает же :)

in4core 11.10.2011 21:26

Ребята извиняюсь поднимаю тему, начал разбираться и нифига не понял что и как тут делать, причем ни в одном из методов....:( сорри объясните дураку.
И так у нас есть a = [1,5,6,9,14,2,0]; Изначально поля заполнены так : 1,5,6 соотв
по нажатию кнопки вперед в ответ я хочу получить 0,1,5 , а по нажатию назад 5,6,9 соотв. и т.д. циклично

silin 11.10.2011 21:50

Код AS3:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
 
        public class Main extends Sprite
        {
                public const FORWARD:String = "вперед";
                public const BACWARD:String = "назад";
                private var arr:Array = [1, 5, 6, 9, 14, 2, 0];
                private var tfArr:Array = [];
 
                public function Main():void
                {
                        createBut(FORWARD);
                        createBut(BACWARD).x = 100;
                        for (var i:int = 0; i < 3; i++)
                        {
                                var tf:TextField = new TextField();
                                tf.x = 100 * i;
                                tf.width = 60;
                                tf.height = 20;
                                tf.border = true;
                                tfArr.push(tf);
                                tf.text = arr[i];
                                addChild(tf);
                        }
                }
 
                private function createBut(text:String):TextField
                {
                        var tf:TextField = new TextField();
                        tf.text = text;
                        tf.width = 80;
                        tf.height = 20;
                        tf.y = 30;
                        tf.background = true;
                        tf.backgroundColor = 0xC0C0C0;
                        tf.selectable = false;
                        tf.addEventListener(MouseEvent.CLICK, but_click);
                        addChild(tf);
                        return tf;
                }
 
                private function but_click(e:MouseEvent):void
                {
                        switch (e.target.text)
                        {
                                case FORWARD:
                                        arr.unshift(arr.pop());
                                        break;
                                case BACWARD:
                                        arr.push(arr.shift());
                                        break;
                        }
                        for (var i:int = 0; i < 3; i++)
                        {
                                tfArr[i].text = arr[i];
                        }
                }
        }
}


in4core 11.10.2011 21:54

Силин огромное тебе спасибище!!!

surlac 11.10.2011 22:17

Цитата:

Сообщение от in4core (Сообщение 1033749)
Подскажите как лучше всего организовать

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

Код AS3:

var iterator:Iterator = new ItemsIterator();
iterator.listItems = itemsArray; // pre-initialized array of Items
iterator.step = 3;
iterator.current = 0;
var item:Item = iterator.firstItem()
while(!iterator.isDone()){
    iterator.nextItem();
}

ItemsIterator:
Код AS3:

public class ItemsIterator { //todo: Implement Iterator interface 
 
    private var listItems:Array /*of Item*/;
    private var current:int = 0
    private var step:int = 1
 
    public function nextItem():Item { 
      Item item = null;
      current += step;
      if (!isDone()) {
        item = (Item) listItems[current];
      }
      return item;
    }
 
    public function previousItem():Item {
      Item item = null;
      current -= step;
      if (!isDone()) {
        item = (Item) listItems[current];
      }
      return item;
    }
 
    public function firstItem():Item {
      current = 0;
      return (Item) listItems[current];
    }
 
    public function lastItem():Item {
      current = listItems.length - 1;
      return (Item) listItems[current];
    }
 
    public function isDone():Boolean {
      return current >= listItems.length ? true : false;
    }
 
    public function currentItem():Item {
      if (!isDone()) {
        return (Item) listItems[current];
      } else {
        return null;
      }
    }
 
    public function set step(int value):void  {
      this.step = value;
    }
 
    public function set current(int value):void  {
      this.current= value;
    }
 
    //todo: public getters/setters for listItems
 
 }


in4core 11.10.2011 23:41

surlac весело но дико громоздко посравнению с предидущим оратором. Впринципе вопрос то и стоял как сделать это поаккуратнее, а через много кода написать это не составит труда


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

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