2014-03-27 44 views
0

我遇到了一個變量沒有更新的問題,當它應該。我也不確定在哪裏更新這個變量,因爲它不適合我的代碼中的任何if語句測試。你必須知道,我需要的全部變量是變量peopleCompleted得到更新時第一個人進入完成。在我的代碼中,您會看到這個第一個人到達的位置,將他的位置作爲curServed,然後打印出來而不被添加到隊列中,其他人排隊。您會注意到curServedserviceComplete()中發生了變化,因爲它處理其他所有人在隊列中。以下是我的代碼和相同的輸出,因爲peopleCompleted未針對該第一人進行更新,所以這是不正確的。基本上,我真的需要幫助,知道在哪裏更新他的完成。這是一個單線隊列的模擬。我是一個初學者/學生Java更新一個唯一變量的問題,模擬1行1隊列

CODE

public boolean arrival() 
    { 
    Customer myCust = new Customer(curTime); 
    if(curServed == null) // If no one being served 
    { 
     curServed = myCust; // myCust is served 
     peopleNoWait++; 
     return true; 
    } 
    else if(!q.isFull()) 
    { 
     q.add(myCust); 
     peopleThatHadToWait++; 
     return true; 
    } 
    return false; 
    } 

    public Customer serviceComplete() 
    { 
    if(q.isEmpty()) 
    { 
     curServed = null; 
    } 
    else 
    { 
     curServed = q.remove(); // Remove next from customer queue 
     peopleCompleted++; 
     sumOfWaitTime += getWaitTime(); 
    } 
    return curServed; 
    } 

THESE BELOW了處理上述

private void doArrival() 
    { 
     boolean check = sim.arrival(); // Do an arrival 
     if(check == false) 
     System.out.println("Customer arrived but left immediately" 
       + " because the line was full (too long) at time " + 
       sim.getTime() + "."); 
     else 
     System.out.println("A customer entered system at time " + 
       sim.getTime() + "." + " Number waiting in queue is " 
       + sim.getNumWaiting() + "."); 
    } 

    private void doServiceComplete() 
    { 
     if(sim.notBeingServed() == true) 
     { 
     System.out.println("No customer is being served at the present time" 
       + " of " + sim.getTime() + "."); 
     } 
     else 
     { 
     System.out.print("Customer " + sim.getCurCust().toString() + 
       " finished at time " + sim.getTime() + ". Number waiting" + 
       " is "); 
     System.out.println(sim.getNumWaiting() + "."); 
     } 
     sim.serviceComplete(); 

方法模擬返回下面的丘壑

public int getNumWaiting() 
    { 
    int total = peopleThatHadToWait - peopleCompleted; 
    return total; 
    } 

    public int getTotalServed() 
    { 
    return peopleCompleted; 
    } 

示例輸出,其中的錯誤是:

  1. 客戶C1/T2結束在時間7編號的等待是2 //應該是1

  2. 客戶C2/T6結束在時間7。數等待是1 //應該是0

  3. 客戶C3/T7結束在時間13號等待是5 // 4

  4. 客戶C4/T7 FINI在時間棚16號等待是4 //等

  5. 客戶C5/T8結束在時間16號等待是3.

  6. 客戶C6/T8結束在時間17號等待是2 。

  7. 客戶C7/T9結束時刻17號等待是1

  8. 的人數擔任爲7 //應該是8

  9. 人SERV數ED是7 //應該是8個

評論:

這些都是造成問題的線路。等待的人數和 服務的人數是不正確的。這是因爲()的缺乏 的他完成後peopleCompleted正在與第一人稱更新,這 根據您的意見,是不是在serviceComplete做

+0

嗨user3386412,一個很好的方式,讓您的問題回答迅速而有效地對堆棧溢出是抽象的問題遠離你的實現細節細節。這涉及到你努力準確理解你想要做什麼(而不是問如何做一些特定的事情,可能或不是如何解決你的問題,就像你在這裏做的那樣)。這有助於我們幫助你。 –

+0

它很難把這個放到一個普通的領域,因爲我不能真正理解這個問題。我明白你在說什麼。 – Adam

+0

當你儘可能地儘量減少解釋和代碼,答案會更快:-) –

回答

1

我懷疑這是因爲這裏的代碼塊。

private void doServiceComplete() 
{ 
    if(sim.notBeingServed() == true) 
    { 
    System.out.println("No customer is being served at the present time" 
      + " of " + sim.getTime() + "."); 
    } 
    else 
    { 
    System.out.print("Customer " + sim.getCurCust().toString() + 
      " finished at time " + sim.getTime() + ". Number waiting" + 
      " is "); 
    System.out.println(sim.getNumWaiting() + "."); 
    } 
    sim.serviceComplete(); 
} 

當你到sim.getNumWaiting()你的人在等待將比你期望的少一個。 sim.serviceComplete()peopleCompleted++這是您打印結果後執行。在調用sim.getNumWaiting()之前,您應該將此移至方法的開頭或其他邏輯位置。

例子:

private void doServiceComplete() 
{ 
    sim.serviceComplete(); 

    if(sim.notBeingServed() == true) 
    { 
    System.out.println("No customer is being served at the present time" 
      + " of " + sim.getTime() + "."); 
    } 
    else 
    { 
    System.out.print("Customer " + sim.getCurCust().toString() + 
      " finished at time " + sim.getTime() + ". Number waiting" + 
      " is "); 
    System.out.println(sim.getNumWaiting() + "."); 
    } 
} 
+0

這確實就是我一週前最終弄清楚的。不過謝謝你,我沒有機會看到它,但這是正確的。 :) – Adam