最近在做的项目中有绘制图表的功能,需要实时更新显示数据,本想用队列来存储数据,通过入队出队来更新数据,但普通队列只支持访问队头元素,而绘制图表需要遍历队列,于是就有了自己实现一个可随机访问队列的想法。
实现也很简单,内部直接用ArrayList实现来实现循环队列.
功能:入队,出队,随机访问队列元素,获取队列容量,清空队列,判断队空队满
直接上代码:
package utils;
import java.util.ArrayList;
/**
* @author 没事啦
* 为支持队列的随机访问,自定义一个简单长度固定的队列的队列
* 内部用ArrayList实现来实现循环队列
* 规则:从队尾进,从队首出
* @param <T> 数组元素类型不固定
*
*/
public class RandomAccessQueue<T> {
private int size; //队列容量
public int length; //队列长度
private int front,rear; //队首序号,队尾序号
private ArrayList<T> list;
public RandomAccessQueue(int size) {
list = new ArrayList<T>(size);
for(int i=0;i<size;i++) {
list.add(null);
}
this.size = size;
this.front = 0;
this.rear = 0;
}
/**
* 获取index所对应的元素,这种随机访问队列相对于普通队列的最重要的作用
* @param index 需要访问的元素序号(从队首到队尾的序号,队首序号为0)
* @return index所对应的元素,index超出队列的长度则返回null
*/
public T get(int index) {
if(index>length) {
return null;
}
return list.get((front+index)%size);
}
/**
* 队首元素出队
* @return 出队的队首元素,如果队列为空,则返回null
*/
public T take() {
if(length<=0) {
return null;
}
T t = list.get(front);
list.set(front, null);
front = (front+1)%size;
length--;
return t;
}
/**
* 元素入队
* @param t 入队元素
* @return 如果队满,则入队失败,返回false,否则将元素插入队尾,返回true
*/
public boolean offer(T t) {
checkNotNull(t);
if(length==size) {
return false;
}
list.set(rear, t);
rear = (rear+1)%size;
length++;
return true;
}
/**
* 获取队列的容量
* @return 队列的容量
*/
public int size() {
return size;
}
private static void checkNotNull(Object v) {
if (v == null)
throw new NullPointerException();
}
/**
* 清空队列
*/
public void clear() {
for(int i=0;i<size;i++) {
list.set(i,null);
}
this.front = 0;
this.rear = 0;
}
/**
* 判断队列是否为空
* @return 是否为空
*/
public boolean isEmpty() {
if(length==0) {
return true;
}
return false;
}
/**
* 判断队列是否满
* @return 是否满
*/
public boolean isFull() {
if(length==size) {
return true;
}
return false;
}
}
只是实现了队列最基本的部分功能,有其他需求可再进行扩展
注:本队列中用size表示的队列的容量,length表示队列的长度,可能和平时使用集合类的习惯有所不同