Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.09.2011, 00:34
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 1  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию Закольцованная выборка нескольких элементов из массива

Есть массив 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);
}


Последний раз редактировалось wvxvw; 25.09.2011 в 13:28.
Старый 25.09.2011, 02:08
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Код 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);
}
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 25.09.2011, 02:11
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 3  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Спасибо

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


Последний раз редактировалось djyamato; 25.09.2011 в 04:31.
Старый 25.09.2011, 11:51
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Код 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);
}

Старый 25.09.2011, 13:19
ProxyGreen вне форума Посмотреть профиль Отправить личное сообщение для ProxyGreen Найти все сообщения от ProxyGreen
  № 5  
Ответить с цитированием
ProxyGreen
 
Аватар для ProxyGreen

Регистрация: Jul 2011
Сообщений: 67
Мой вариант:
Код 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;
 
}
Можно задавать отрицательные позиции.


Последний раз редактировалось ProxyGreen; 25.09.2011 в 16:05.
Старый 25.09.2011, 13:23
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код 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);
		}
	}
}
Еще вариант, без того, чтобы создавать вспомогательные массивы и с возможностью ротации на число позиций отличное от количества элементов, которые требуется получить в на каждой ротации. + счетчик циклов можно оптимизировать, т.как он сравнивет с константой величиной.
__________________
Hell is the possibility of sanity

Старый 25.09.2011, 14:07
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 7  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Был еще такой вариант
__________________
Поймай яблоко 2!

Старый 25.09.2011, 16:08
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 8  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Код 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

Старый 25.09.2011, 17:24
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 9  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
i.o., хорошо упаковал! Интересно, как со скоростью
__________________
Поймай яблоко 2!

Старый 25.09.2011, 17:54
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 10  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
ну, полагаю, математика быстрее условий

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:08.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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