2011-01-31 65 views
0

我有一個叫做conveyorBeltArrayList,它存儲已經拾取並放置在傳送帶上的訂單。我還有另一個ArrayList,名爲readyCollected,其中包含客戶可以收集的訂單列表。我用正確的方式寫這個方法嗎?

我想要做的與我創建的方法是當輸入ordNum,它返回true,如果訂單已準備好由客戶收集(從而從readyCollected刪除收集的訂單)。如果訂單還沒有被選中,那麼它返回false。

我想知道這是寫的方法,以正確的方式...

public boolean collectedOrder(int ordNum) 
    { 
     int index = 0; 
     Basket b = new Basket(index); 
     if(conveyorBelt.isEmpty()) { 
      return false; 
     } 
     else { 
      readyCollected.remove(b); 
      return true; 
     } 
    } 
+0

我們看不到很多正在發生的事情。什麼是籃子?它的平等方法是否明確?什麼是類型readyCollected? – 2011-01-31 21:05:09

+0

您沒有使用`ordNum`,所以顯然有些問題。另外,b總是'Basket(0)`。也許它應該是`Basket(ordNum)`?我們需要看到更多的代碼! – 2011-01-31 21:07:56

+0

@Andrew White,Basket是持有產品集合的類(這是用於arrayList的)。 – Mayfield 2011-01-31 21:14:30

回答

1

我有點困惑,因爲你不使用ordNum可言。

如果你想確認你的代碼的操作並且通常增加你寫的東西的可靠性,你應該檢查出unit testing以及可用於此的Java框架。

+0

謝謝,Amir Rachum指出我根本不使用ordNum。但是我寫的東西有什麼不對嗎? – Mayfield 2011-01-31 21:24:19

1

您可以使用ArrayList來解決這個問題,但我認爲這是從根本上考慮問題的錯誤方法。一個ArrayList適用於存儲完整的數據序列,而且沒有間隙,因此您只可能在最後添加或刪除元素。刪除其他位置的元素效率不高,如果您在高索引處只有一個值,那麼您將浪費大量空間填充空值的所有較低位置。

相反,我建議使用Map將訂單號與特定訂單相關聯。這更自然地編碼你想要的 - 每個訂單號碼都是與訂單相關的關鍵。 Map s,特別是HashMap s,具有非常快速的查找(預期的恆定時間)並且使用(大致)相同的空間量,而不管有多少個密鑰。此外,插入或從HashMap中刪除元素的時間預計是恆定的,這是非常快的。

至於你的特定代碼,我同意Brian Agnew在這個問題上,你可能想爲它編寫一些單元測試,並找出你爲什麼不使用ordNUm參數。也就是說,我建議在重做系統之前使用HashMap而不是ArrayList;節省的時間和代碼的複雜性將真正得到回報。

0

根據您的描述,爲什麼不是這樣足夠:

public boolean collectedOrder(int ordNum) {   
     return (readyCollected.remove(ordNum) != null); 
    } 

爲什麼conveyorBelt ArrayList中甚至需要進行檢查?

0

正如已經指出的那樣,您很可能需要使用ordNum

除此之外,任何人都可以用你發佈的代碼給出的最佳答案是「也許」。你的邏輯看起來是正確的,並與你所描述的內容聯繫在一起,但它是否正在做它應該完全取決於你在其他地方的實現。作爲一般指針(在這種情況下可能適用,也可能不適用),你應該確保你的代碼處理邊緣情況和不正確的值。因此,如果readyCollected.remove(b);例如返回false,您可能想要標記出錯,因爲這表示b不在要移除的列表中。

正如已經指出的那樣,看看使用JUnit這種類型的東西的單元測試。這很容易使用,編寫徹底的單元測試是一個很好的習慣。

相關問題