[英]Java Arrays - unsure about methods
我已經設置了Java任務,這基本上是飯店的模型。 除了最困難的部分外,我基本上已經完成了它。 它基本上是在處理數組和對象。 我不確定其中的幾個部分。 我已經完成了使用Array / HashMap實現ArrayList和另一個的類。
這是我到目前為止的內容:
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方法獲取定義的整個數組(請說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,null等之前停止。但是它占用了整個Array,其中有8個是null值; 我不確定如何解決此問題。 數組周圍是否有任何東西並定義其長度; 在上面的示例中,我僅添加了2個項目,但我聲明了一個長度為[10]的數組; 我怎么知道定義數組的長度? 如果用戶在上面的示例中添加了20個啟動器,程序將崩潰。
當我使用main方法測試了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();
}
}
Java中的數組大小固定:在實例化時,必須提供大小。 實例化后,數組大小永遠不會改變。
您需要的是一種定義動態大小的數組的工具。 為此,標准JDK中存在許多功能。 查看List
接口及其各種實現( ArrayList
, LinkedList
等)。
一些要點:
ArrayList
, Arrays
, Iterator
但從不使用它們,目的是什么? 您正在使用具有您提到的問題的靜態數組。 ArrayList
在內部存儲您的元素,為什么當有一個類適合您時,如果需要的話,為什么還要管理一個必須增長的靜態數組呢? (實際上,在您的情況下, LinkedList
更好,請看下一點) 據我了解,您已經使用ArrayList
和Map
實現了相同的功能,現在您需要使用數組來實現它。
最簡單的事情是保留一個額外的字段,其中包含有效元素的數量。 不要依賴於找到一個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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.