2012-12-04 23 views
2

我已經設置了一個基本上是餐廳模型的Java任務。除了最困難的部分之外,我大多完成了它。它基本上是處理數組和對象;有幾個部分我不確定。我已經完成了實現ArrayList的類和使用Map/HashMap的類。Java數組 - 不確定方法

這是我到目前爲止有:

package restaurant; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 


public class ArrayOrder implements Order { 

    Product order[]; 

    public ArrayOrder() { 
     this.order = new Product[1000]; 
    } 

    public Iterator<Product> iterator() { 

    } 


    public void addItem(Product product, int quantity) {  
     /*for(int i = 0; i < quantity; i++) 
     { 
      this.order[i] = product; // WRONG CODE 
     }*/ 
    } 


    public void removeItem(Product product) { 

    } 


    public int numberOfItems() { 
     int length = 0; 
     for(int i = 0; i < this.order.length; i++){ 
      if(this.order[i] != null) { 
       length++; 
      } 
     } 
     return length; 
    } 


    public int totalCost() { 
     int resultcost = 0; 
     for(int i = 0; i < this.order.length; i++) { 
      if(this.order[i] != null) { 
        resultcost += this.order[i].getCost(); 
      } 
     } 
     return resultcost; 
    } 

    public String toString() { 
      return Arrays.toString(this.order); 
    } 

    public int hashCode() { 

    } 

    public boolean equals() { 

    } 
} 

我已閱讀,你不能讓一個未定義長度的數組,但我不知道人們會如何處理這一點;如果我將數組初始化爲一個證書號碼,則可能會發生錯誤。假如我將數組初始化爲[10]並且用戶添加了20個產品,那麼就會出錯。

第二個問題是addItem函數;我知道我在這裏編寫的邏輯的問題是,產品正在寫入的數組的索引只會與數量一樣大,因此數組的索引是產品寫入的位置;不搜索'this.order'並找到一個NULL數組值並將該產品寫入數量限制器指定的次數。我不確定該去哪裏。

下一個問題是我想象中的removeItem函數對addItem使用類似的邏輯。我沒有在這裏寫任何東西,因爲我的嘗試是錯誤的,我無法獲得addItem函數來開始工作,所以我離開了這個。

最後一個問題是toString方法。 toString方法獲得整個數組的定義(SAY this.order = new Product [10]),我並不想這樣做。

例如:

//int id, String name, String description, int cost, int serves 

Starter s = new Starter(25, "Salad", "A traditional English salad", 750, 1); 
Order o3 = new ArrayOrder(); 
o3.addItem(s, 2); 

toString方法產生:

[Salad - A traditional English salad (serves 1) $7.50, Salad - A traditional English salad (serves 1) $7.50, null, null, null, null, null, null, null, null] 

我希望它無效之前停止,NULL,NULL等。但它正在整個陣列和8他們是空值;我不確定如何解決這個問題。無論如何圍繞陣列並定義其長度;在我上面的例子中,我只添加了2個項目,但是我聲明瞭一個長度數組[10];我如何知道定義Array的長度?如果用戶在我上面的示例中添加了20個啓動器,程序將崩潰...

numberOfItems & totalCost功能在我用主方法測試它們時起作用。

任何指導指向我在正確的方向將不勝感激。 謝謝,

編輯: 我覺得我有點不清楚;要求是我要根據UML圖創建幾個類。在這我必須創建3個類都實現一個Order界面。這三個類是(ListOrder,ArrayOrder,MapOrder)。我已經完成MapOrder和ListOrder,但是我被卡在ArrayOrder上。

這裏是我的ArrayList類:

package restaurant; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

public class ListOrder implements Order{ 

    private List<Product> order; 

    public ListOrder() { 
     this.order = new ArrayList<Product>(); 
    } 

    public Iterator<Product> iterator() { 
     return order.iterator(); 
    } 


    public void addItem(Product product, int quantity) { 
     for(int i = 0; i < quantity; i++) { 
      this.order.add(product); 
     } 
    } 


    public void removeItem(Product product) { 
     this.order.remove(product); 
    } 


    public int numberOfItems() { 
     return this.order.size(); 
    } 


    public int totalCost() { 
     int resultcost = 0; 
     for(Product p : order) 
     { 
      resultcost += p.getCost(); 
     } 
     return resultcost; 
    } 

    public String toString() { 
     return this.order.toString(); 
    } 

} 
+3

我不明白爲什麼你不能在內部使用'ArrayList'。它是否明確禁止?你正試圖用一個靜態數組來模擬一個動態數組,這正是'ArrayList'所做的。 – Jack

+1

['ArrayList'](http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)是一個「動態數組」,它爲您提供了一個自動調整大小的「數組「,其中還包括添加/插入和刪除內置方法。 – MadProgrammer

+0

我根本沒有看到你使用ArrayList。使用ArrayList是一種在您不知道其大小時創建集合的方法。 – jahroy

回答

1

數組在Java中大小是固定的:在實例,必須提供大小。在實例化之後,該數組的大小永遠不會改變。

你需要的是定義一個動態大小的數組的設施。爲此,標準JDK中存在許多設施。查看List界面及其各種實現(ArrayList,LinkedList等)。

+1

「不可變」意味着非常具體的東西 - 可能要在那裏使用不同的單詞。 (例如不可更改) – arshajii

0

幾點:

  • 要導入ArrayListArraysIterator但從來沒有使用它們,目的是什麼?你只是使用一個有你提到的問題的靜態數組。
  • 你應該考慮使用ArrayList內部存儲你的元素,爲什麼你會打擾管理一個靜態數組,如果需要的話,當有一個類包裝這個功能適合你時,它必須增長? (實際上LinkedList在你的情況下更好,請看下一點)
  • 通過查看你應該向外界提供的信息,而不是你不需要隨機訪問,這意味着如果你真的想要滾動你自己的集合,你應該將它建模爲鏈接列表,因爲你不會遇到你提到的問題(如不得不增加數組的大小或管理空值)。
+0

嗨,我已經搞亂了代碼,我忘了刪除一些我導入的東西。我打算在添加和刪除函數工作後編寫Iterator函數。感謝您的幫助, – user1874133

0

據我所知,你已經使用ArrayListMap實現了相同的功能,現在你需要使用數組來實現它。

最簡單的做法是保留一個額外的字段與有效元素的數量。不要依賴於找到一個null元素,因爲這是效率低下並容易出錯(特別是在需求突然變化並且您需要考慮到null元素時)。

您還需要一個int quantities[]字段來保持數量。這兩個數組應始終具有相同的大小。

然後,當您必須添加新元素時,可以將有效元素的數量與order.length(當前分配的「容量」)進行比較。如果添加新元素將超過產能,那麼你只需要重新分配order

public void addItem(Product product, int quantity) {  
    if (currentSize >= order.length) { 
     Product[] temp = new Product[order.length + GROWTH_FACTOR]; 
     System.arraycopy(order, 0, temp, 0, currentSize); 
     order = temp; 
     int[] q2 = new int[order.length + GROWTH_FACTOR]; 
     System.arraycopy(quantities, 0, q2, 0, currentSize); 
     quantities = q2; 
    } 
    quantities[currentSize] = quantity; 
    order[currentSize++] = product; 
} 

這裏GROWTH_FACTOR是多少,當你運行的空間展開數組常量。

或者,你可以引入一個私有靜態類,保持產品/數量對:

private static class OrderItem { 
    final Product product; 
    final int quantity; 
    OrderItem(Product product, int quantity) { 
     this.product = product; 
     this.quantity = quantity; 
    } 
} 

private OrderItem[] orders; 
private int currentSize; 

public void addItem(Product product, int quantity) { 
    if (currentSize >= orders.length) { 
     // reallocate orders array 
    } 
    orders[currentSize++] = new OrderItem(product, quantity); 
} 
+0

我對代碼的第一位有點不確定;什麼是currentSize變量,以及如何實現/確定GROWTH_FACTOR?感謝您的幫助, – user1874133

+0

@ user1874133 - 'currentSize'應該是您的'ArrayOrder'類的一個字段。它應該以'0'開始,每次添加訂單時應增加1,每次刪除訂單時減少。它應該始終等於有效訂單的數量(包含有效數據的'orders'數組的插槽數量)。 'GROWTH_FACTOR'完全是任意的 - 它可以是任何正整數。它越小,在添加訂單時就越需要重新分配陣列;它越大,浪費的空間就越多。值'10'可能很好地工作。 –

+0

@ user535871 - 在我的類的頂部我把int currentSize = 0; - 在我的addItem方法中,我只是把currentSize ++(在if語句之上)。正是在這種方法中,我將GROWTH_FACTOR定義爲10.我正在朝着正確的方向前進嗎?.......我也遇到了數量變量的一些錯誤...感謝您的幫助, – user1874133