2

基本的にレストランのモデルである Java の割り当てが設定されています。最も難しい部分を除いて、ほとんど完了しました。基本的に配列とオブジェクトを扱っています。よくわからない部分がいくつかあります。ArrayList を実装するクラスと、Map/HashMap を使用する別のクラスを既に完成させています。

これは私がこれまでに持っているものです:

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 個の製品を追加すると、エラーが発生します。

2 番目の問題は addItem 関数です。私がここに書いたロジックの問題は、製品が書き込まれている配列のインデックスが数量と同じ大きさになるだけであるため、数量の配列インデックスが製品が書き込まれている場所であることを知っています。「this.order」を検索せず、NULL 配列値を見つけて、数量パラメーターで指定された回数だけ積を書き込みます。これでどこに行くべきかわかりません。

次の問題は、addItem と同様のロジックを使用していると思われる removeItem 関数です。私の試みが間違っていて、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などの前に停止したいのですが、配列全体を取り込んでおり、そのうち8つはnull値です。これを修正する方法がわかりません。とにかく配列の周りにあり、その長さを定義しています; 上記の例では、2 つの項目しか追加していませんが、長さ [10] の配列を宣言しました。配列を定義する長さをどのように知ることができますか? 上記の例でユーザーが 20 個のスターターを追加すると、プログラムがクラッシュします...

numberOfItems & totalCost 関数は、メイン メソッドでテストしたときに機能します。

私を正しい方向に向けるためのガイダンスは大歓迎です。ありがとう、

編集:私は少し不明確だったと思います。要件は、UML ダイアグラムに基づいていくつかのクラスを作成することです。ここで、Order インターフェイスを実装する 3 つのクラスを作成する必要があります。3 つのクラスは (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();
    }

}
4

3 に答える 3

1

Java の配列はサイズが固定されています。インスタンス化の際、サイズを指定する必要があります。インスタンス化後に配列のサイズが変わることはありません。

必要なのは、動的サイズの配列を定義する機能です。そのために、多くの機能が標準の JDK 内に存在します。Listインターフェイスとそのさまざまな実装 (ArrayListなど) を見てくださいLinkedList

于 2012-12-04T00:28:41.190 に答える
0

私が理解しているように、あなたは と を使用して同じ機能をArrayList実装Mapしましたが、配列を使用して実装する必要があります。

最も簡単な方法は、有効な要素の数を含む追加のフィールドを保持することです。要素の検索に依存しないでください。nullこれは非効率でエラーが発生しやすいためです (特に、要件が突然変更され、要素を許可する必要がある場合null)。

int quantities[]数量を維持するためのフィールドも必要です。これら 2 つの配列は、常に同じサイズにする必要があります。

次に、新しい要素を追加する必要がある場合は、有効な要素の数を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);
}
于 2012-12-04T00:34:58.243 に答える
0

いくつかのポイント:

  • をインポートしていますがArrayList、使用しないでください。目的は何ですか? あなたが言及した問題がある静的配列を使用しているだけです。ArraysIterator
  • を使用して要素を内部に格納することを検討するArrayList必要があります。この機能を適切にラップするクラスがある場合に、必要に応じて拡張する必要がある静的配列を管理する必要があるのはなぜですか? (実際にLinkedListは、あなたの状況では a の方が優れています。次の点を見てください)
  • 外部に提供する必要があるものを見ると、ランダムアクセスが必要ないことがわかります。これは、本当に独自のコレクションを展開したい場合は、それをリンクリストとしてモデル化する必要があることを意味します。あなたが言及した問題(配列のサイズを大きくしたり、null値を管理したりする必要があるなど)。
于 2012-12-04T00:30:25.000 に答える