原文地址:http://blog.csdn.net/eclipser1987/article/details/5395788
聊天系统中,我们会使用Array来保存聊天信息。但如果Array不限制大小,无限保存,对于用户的系统是个非常大的压力。这时我们就需要一个有固定大小的队列,将超过10条/50条的数据删除,保留新的数据。
- package {
- import flash.display.Sprite;
- import flash.events.MouseEvent;
- public class Main extends Sprite
- {
- private var arr:Array = new Array();
- private var temp:uint = 0;
- public function Main()
- {
- for(var i:uint = 0;i<10;i++)
- {
- arr.push(i);
- }
- stage.addEventListener(MouseEvent.CLICK,onClick);
- }
- private function onClick(e:MouseEvent):void
- {
- trace("onClick");
- trace("------------------");
- for(var j:uint = 0;j<arr.length;j++)
- {
- trace("arr["+j+"] : "+arr[j]);
- }
- trace("------------------");
- arr.shift();
- arr.push(temp++);
- trace("arr.length ---> "+arr.length);
- for(var k:uint = 0;k<arr.length;k++)
- {
- trace("arr["+k+"] : "+arr[k]);
- }
- }
- }
- }
点击5次后打印结果为:
- [SWF] G:/work2/AS3队列/bin-debug/Main.swf - 1,662 bytes after decompression
- onClick
- ------------------
- arr[0] : 0
- arr[1] : 1
- arr[2] : 2
- arr[3] : 3
- arr[4] : 4
- arr[5] : 5
- arr[6] : 6
- arr[7] : 7
- arr[8] : 8
- arr[9] : 9
- ------------------
- arr.length ---> 10
- arr[0] : 1
- arr[1] : 2
- arr[2] : 3
- arr[3] : 4
- arr[4] : 5
- arr[5] : 6
- arr[6] : 7
- arr[7] : 8
- arr[8] : 9
- arr[9] : 0
- onClick
- ------------------
- arr[0] : 1
- arr[1] : 2
- arr[2] : 3
- arr[3] : 4
- arr[4] : 5
- arr[5] : 6
- arr[6] : 7
- arr[7] : 8
- arr[8] : 9
- arr[9] : 0
- ------------------
- arr.length ---> 10
- arr[0] : 2
- arr[1] : 3
- arr[2] : 4
- arr[3] : 5
- arr[4] : 6
- arr[5] : 7
- arr[6] : 8
- arr[7] : 9
- arr[8] : 0
- arr[9] : 1
- onClick
- ------------------
- arr[0] : 2
- arr[1] : 3
- arr[2] : 4
- arr[3] : 5
- arr[4] : 6
- arr[5] : 7
- arr[6] : 8
- arr[7] : 9
- arr[8] : 0
- arr[9] : 1
- ------------------
- arr.length ---> 10
- arr[0] : 3
- arr[1] : 4
- arr[2] : 5
- arr[3] : 6
- arr[4] : 7
- arr[5] : 8
- arr[6] : 9
- arr[7] : 0
- arr[8] : 1
- arr[9] : 2
- onClick
- ------------------
- arr[0] : 3
- arr[1] : 4
- arr[2] : 5
- arr[3] : 6
- arr[4] : 7
- arr[5] : 8
- arr[6] : 9
- arr[7] : 0
- arr[8] : 1
- arr[9] : 2
- ------------------
- arr.length ---> 10
- arr[0] : 4
- arr[1] : 5
- arr[2] : 6
- arr[3] : 7
- arr[4] : 8
- arr[5] : 9
- arr[6] : 0
- arr[7] : 1
- arr[8] : 2
- arr[9] : 3
- onClick
- ------------------
- arr[0] : 4
- arr[1] : 5
- arr[2] : 6
- arr[3] : 7
- arr[4] : 8
- arr[5] : 9
- arr[6] : 0
- arr[7] : 1
- arr[8] : 2
- arr[9] : 3
- ------------------
- arr.length ---> 10
- arr[0] : 5
- arr[1] : 6
- arr[2] : 7
- arr[3] : 8
- arr[4] : 9
- arr[5] : 0
- arr[6] : 1
- arr[7] : 2
- arr[8] : 3
- arr[9] : 4
数组的长度始终不变,为10,且数据的最老(最先加入的)就被新的替换掉,且数组的下标不会固定不变。
将思想封装为一个类:
- package
- {
- /**
- * AS3实现队列
- */
- public class Queue
- {
- private var arr:Array;
- // change = true表示,队列长度可以改变,作用类似一般的Array,
- // change = false表示,队列长度不可以改变,有新的数据加入,将替换数组的最初的数据
- private var change:Boolean;
- public function Queue(_arr:Array,_change:Boolean)
- {
- arr = _arr;
- change = _change
- }
- /**
- * 对立中添加数据
- */
- public function add(_obj:Object):Array
- {
- if(change)
- arr.shift();
- arr.push(_obj);
- return arr;
- }
- /**
- * 让数组实现队列,arr为需要实现队列的数组,msg为该数组需要保存的数据,max为该数组最大保存的数量,默认值为10
- */
- public static function queueArray(_arr:Array,_obj:Object,_max:uint = 10):Array
- {
- if(_arr.length >= _max) _arr.shift();
- _arr.push(_obj);
- return _arr;
- }
- }
- }
测试
- package
- {
- import flash.display.Sprite;
- import flash.events.MouseEvent;
- public class Main2 extends Sprite
- {
- public function Main2()
- {
- super();
- stage.addEventListener(MouseEvent.CLICK,onClick);
- }
- private function onClick(e:MouseEvent):void
- {
- trace("onClick");
- var arr:Array = new Array();
- for(var i:uint = 0;i<10;i++)
- {
- arr.push(i);
- }
- trace(arr);
- Queue.queueArray(arr,100,10);
- trace(arr);
- var queue:Queue = new Queue(arr,true);
- trace(queue.add(200));
- var queue2:Queue = new Queue(arr,false);
- trace(queue2.add(300));
- }
- }
- }
打印结果:
- onClick
- 0,1,2,3,4,5,6,7,8,9
- 1,2,3,4,5,6,7,8,9,100
- 2,3,4,5,6,7,8,9,100,200
- 2,3,4,5,6,7,8,9,100,200,300