簡體   English   中英

Java數組-不確定方法

[英]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接口及其各種實現( ArrayListLinkedList等)。

一些要點:

  • 您要導入ArrayListArraysIterator但從不使用它們,目的是什么? 您正在使用具有您提到的問題的靜態數組。
  • 您應該考慮使用ArrayList在內部存儲您的元素,為什么當有一個類適合您時,如果需要的話,為什么還要管理一個必須增長的靜態數組呢? (實際上,在您的情況下, LinkedList更好,請看下一點)
  • 通過查看您應該提供給外部的東西,我看到您不需要隨機訪問,這意味着,如果您確實想滾動自己的收藏集,則應將其建模為鏈接列表,因為您將沒有您提到的問題(例如必須增加數組的大小或管理空值)。

據我了解,您已經使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM