【问题标题】:Queue not deleting elements (using linkedlist) [java]队列不删除元素(使用链表)[java]
【发布时间】:2015-03-19 02:40:32
【问题描述】:

我试图通过制作一个非常简单的程序来模拟结帐行来掌握队列的窍门。由于某种原因,我的自定义出队函数(使用链表的 removeFirst())实际上不会删除队列中的内容。

这是 CustomerQueue 类

public class CustomerQueue<E> {   

private LinkedList<E> list = new LinkedList<>();  
public void enqueue(E e) { list.addLast(e); }   
public E dequeue() { return list.removeFirst(); }  
public int size() { return list.size(); } 
public E element() { return list.getFirst(); }

@Override    
public String toString() { return "Queue: " + list.toString(); }  

 }

这是我的主要内容:

public static void main(String[] args) {

    CustomerQueue<Customer> queue = new CustomerQueue<>();

    final int totalTime = 720;
    int totalServiced = 0;
    int totalQueued = 0;
    int totalArrived = 1;
    int maxQueuedAtOnce = 0;
    Customer next = new Customer();

    queue.enqueue(next);
    System.out.println(next.getATime() + " <-- ATIME STIME --> " + next.getSTime());


    for (int minute = 0; minute < totalTime; minute++) {
        System.out.println("-- Minute " + (minute + 1) + " ---------");

        if (queue.element().getSTime() == 0) {
            totalServiced++;
            System.out.println("Current customer (" + queue.dequeue() + ") finished being serviced. (Removed)");
            //queue.dequeue();
        }

        if (next.getATime() == 0) {
            System.out.println("Customer ID=" + next.getID() + " has arrived.");
            queue.enqueue(next);
            System.out.println("Customer ID=" + next.getID() + " in queue.");
            next = new Customer();
            System.out.println("New Customer generated. ID=" + next.getID() + " ATIME: " + next.getATime() + " STIME: " + next.getSTime());
            totalArrived++;
            totalQueued++;
        }
        System.out.println("Customer ID=" + next.getID() + " arrival ticked down.");
        next.tickArrivalDown();
        queue.element().tickServiceDown();
        System.out.println("Current queue customer ID=" + next.getID() + " ticked down.");

        if (queue.size() > maxQueuedAtOnce)
            maxQueuedAtOnce = queue.size();
    }

    System.out.println("Total Customers Generated " + next.getNumCustomers());
    System.out.println("Total Customers Serviced: " + totalServiced);
    System.out.println("Total Customers Arrived: " + totalArrived);
    System.out.println("Maximum Customers Queued: " + maxQueuedAtOnce);
    System.out.println(queue.element());
}   

当然还有客户类:

public class Customer {
private int serviceTime;
private int arrivalTime;
private static int numCustomers = 0;
private int ID;

public int getSTime() { return serviceTime; }
public void setSTime(int t) { serviceTime = t; } 
public int getATime() { return arrivalTime; }
public void setATime(int t) { arrivalTime = t; } 
public int getID() { return ID; }
public static int getNumCustomers() { return numCustomers; }

Customer() {
    serviceTime = (int) (Math.random()*3 + 1);
    arrivalTime = (int) (Math.random()*3 + 1);
    ID = ++numCustomers;
}

public void tickServiceDown() { serviceTime--; }
public void tickServiceUp() { serviceTime++; }

public void tickArrivalDown() { arrivalTime--; }
public void tickArrivalUp() { arrivalTime++; }

@Override
public String toString() {
    return "ID: " + ID + " ArrivalTime: " + arrivalTime + " ServiceTime: " + serviceTime;

}
}

当客户被实例化时,我设置的客户类会生成自己的到达时间和完成时间。基本上在循环结束时,下一个客户的到达时间会减少,当前客户的服务时间会减少。当当前客户的服务时间达到 0 时,它应该出列/删除 LinkedList 中的第一个元素。出于某种原因,它没有删除它。这是循环后的输出:

Total Customers Generated 358
Total Customers Serviced: 1
Total Customers Arrived: 358
Maximum Customers Queued: 357
ID: 1 ArrivalTime: 0 ServiceTime: -717

我完全被难住了,再多的谷歌搜索也无济于事。

【问题讨论】:

    标签: java linked-list queue


    【解决方案1】:

    查看你的输出

    ID: 1 ArrivalTime: 0 ServiceTime: -717
    

    ServiceTime 是 getSTime() 中返回的内容

    那么作为0 != -717我认为下面会很好

    How about if (queue.element().getSTime() <= 0) {
    

    【讨论】:

    • 不会超过 2 或 3 分钟,NoSuchElementException。又玩了一会儿,找到了解决办法,下面贴出来。
    【解决方案2】:

    我想出了答案。初始 if 语句:

    if (queue.element().getSTime() == 0) 需要变成if (queue.size() &gt; 0 &amp;&amp; queue.element().getSTime() == 0)

    还需要使 queue.element().tickServiceDown(); 包含在以下 if 语句 if (queue.size() &gt; 0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      相关资源
      最近更新 更多