二、 创建一个Queue类
一个队列是一个很有用的数据结构。为了理解一个队列的功能,你可以想像在一个娱乐公园人们排队骑马的情形。人们从队的后面进入到队中。为此,他们等待而最后到达队伍的前端。其顺序不能改变。
这种情形可以被应用到一个队列类上去。它共有两个方法,分别是"push"和"pop"。你使用push方法来把对象放置到队列中,而使用pop方法从队列中删除一项。例如,如果你使用push方法把三个对象添加到队列上,那么连续调用pop三次将以同样顺序从队列中删除这三个元素。这正与娱乐公园的情形相一致。如果有三个人以一特定的顺序进入队中,他们将以相同的顺序得到骑马娱乐。
下列代码显示出怎么实现一个使用泛型的Java队列。
package com.heatonresearch.examples.collections;
import java.util.*;
public class Queue {
private ArrayList list = new ArrayList();
public void push(T obj) { list.add(obj); }
public T pop() throws QueueException {
if (size() == 0)
throw new QueueException(
"Tried to pop something from the queue, " +
"when it was empty");
T result = list.get(0);
list.remove(0);
return result;
}
public boolean isEmpty() { return list.isEmpty(); }
public int size() { return list.size(); }
public void clear() { list.clear(); }
}
前面的代码声明了队列类,这样它可以接收一个泛型类型。
public class Queue
泛型类型"T"是该类类型-它将被放入到该队列中去。为了把这些项存储到一个队列中,该类还要创建一个接收"T"类型的ArrayList。
push方法很简单的。它接收单一的类型为泛型"T"的对象,并且把它添加到ArrayList上。
pop方法稍微复杂些。首先,如果你要从队列中弹出一个对象,并且如果在队列中没有对象,那么该类将抛出一个QueueException类型的异常。下面是QueueException类。
package com.heatonresearch.examples.collections;
public class QueueException extends Exception {
public QueueException(String msg) {
super(msg);
}
}
下面是抛出QueueException类型异常的代码:
if (size() == 0)
throw new QueueException("Tried to pop something from the queue, " +
"when it was empty");
如果队列不空,该方法将从队列中检索最后一个元素,在一个名叫result的变量中存储它,然后从该列表中删除这个项。下面几行代码实现了这一功能:
T result = list.get(0);
list.remove(0);
return result;
注意,该临时变量也是泛型类型"T"。当这个类与真实的代表泛型类型的Java类型一起使用时,为了实现最大程度上的兼容性,无论你何时存取这些变量,确保总是使用泛型类型是非常重要的。
