所以现在我正在制作一个商店模拟器,它可以计算物品,平均等待时间等在线的用户等等。到目前为止,我已经能够获得所有必需的数据没有问题,但现在我我无法为当前未检出的每个客户设置计时器。因此,如果队列中的客户不是第一个(检出的那个),我会启动一个计时器,每秒将等待时间增加一个。一旦它们成为第一个(它们被检出)它就会停止计时器,然后将该时间加到该行或队列的整个等待时间。我这样做的方法是程序每秒都会使用每个队列运行此方法(在这种情况下,我有六个“行”或队列)。这是我到目前为止的一个例子:
private void waitTime(LineQueue<Customer> l){
Iterator<Customer> iter = l.iterator();
Customer[] c = new Customer[l.size()];
int count = 0;
if(iter.hasNext()){
try{
c[count] = iter.next();
}catch(NullPointerException e){
//does nothing with it
}
}
for(int i = 1; 1 < c.length; i++){
try{
c[i].incrimentWaitTime();
}catch(NullPointerException | ArrayIndexOutOfBoundsException e){
//does nothing with it
}
}
}
然后如何实施:
timer.scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
for(LineQueue<Customer> e : queues){
waitTime(e);
}
}
}, 0, 1000);
此时我不知道该怎么做,虽然从我的看法来看,我必须使用Iterator才能使其正常工作。这里还有关于每个东西如何放入队列的代码:
private static class Node<Customer> {
private Customer data;
private Node<Customer> next;
private Node(Customer dataItem) {
data = dataItem;
next = null;
}
private Node(Customer dataItem, Node<Customer> nodeRef){
data = dataItem;
next = nodeRef;
}
}
private Node<Customer> front;
private Node<Customer> rear;
private Node<Customer> ref;
public boolean offers(Customer e){
if(size == 0){
front = new Node<Customer>(e);
}else if(size == 1){
front.next = new Node<Customer>(e);
ref = front.next;
}else{
ref.next = new Node<Customer>(e);
ref = ref.next;
}
size++;
CPH++;
return true;
}
这是内部Iterator类:
private class Iter implements Iterator<Customer>{
private int count;
private Node<Customer> obj;
public Iter(){
obj = front;
}
@Override
public boolean hasNext(){
return count < size;
}
@Override
public Customer next(){
if(!hasNext()){
throw new NoSuchElementException();
}
Customer returnVal = obj.next.data;
obj = obj.next;
count++;
return returnVal;
}
希望这应该足以理解发生了什么。