0

私の質問の理解をさらに深めるために:

Javaの教科書で、市場から購入するアイテムのリストを表すGroceryListという名前のクラスと、特定のアイテムの購入要求を表すGroceryItemOrderという名前のクラスを作成するように求められるという問題があります。与えられた量で(例えば:オレンジの4単位)。さらに指示があれば、実装されたすべてのメソッドの結果をテストして印刷するクライアントを開発する予定です。

免責事項:私は誰にも私のためにこの問題をするように頼んいません。クライアントGroceryListClientからの指示に応じて、 GroceryItemOrderクラスからGroceryListクラスにインスタンスメソッドを実装する方法を明確にするために、メンターを求めているだけです。

GroceryListクラスのコード:

public class GroceryList_test {
    public GroceryList_test() {
        GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
    }

    public void add(GroceryItemOrder_test item) {
        GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
        GroceryList[1] = item;
        System.out.println(GroceryList[1]);
    }

    /*public double getTotalCost(GroceryItemOrder_test item) {
    }*/
}

インスタンスメソッドadd(GroceryItemOrder_test item)の下で:

  • リストに含まれるアイテムが10未満の場合、指定されたアイテムの順序(GroceryItemOrderクラスにアクセスするときにGroceryListClientによって指示される)をこのリストに追加します(この要素について心配する必要はありません。ifステートメントとnull例外を使用してこれを行うことができます)。

このメソッドで、 GroceryListClientクライアントで指示するたびに、 GroceryItemOrder_test(文字列名、int数量、double priceperunit)から配列にアイテムの注文を動的にロードする必要があります。これは、後でアクセスして合計コストを計算するためにアクセスされます。以下のTotalCost()インスタンスメソッド。

GroceryItemOrderクラスのコード:

public class GroceryItemOrder_test {
    String itemID;
    int NumberofItems;
    double priceperunit;

    public GroceryItemOrder_test(String name, int quantity, double pricePerUnit) {
        this.itemID = name;
        System.out.println("Item: " + itemID);
        this.NumberofItems = quantity;
        System.out.println("Quantity: " + NumberofItems);
        this.priceperunit = pricePerUnit;
        System.out.println("Price per unit: $" + priceperunit);
    }

    public double getCost() {
        return ((NumberofItems * priceperunit) * 100.0) / 100.0;
    }
    public void setQuantity(int quantity) {
    }
 }

パブリッククラスの下でpublicGroceryItemOrder_test(String name、int amount、double pricePerUnit)

  • 指定された名前のアイテムを指定された数量で購入するためのアイテム注文を作成します。これには、ユニットあたりの指定された価格がかかります。

このメソッドを、 GroceryListクラスのインスタンスメソッドadd(GroceryItemOrder_test item)の配列にロードしたいと思います。

GroceryListClientクライアントからのコード:

public class GroceryListClient {
    public static void main(String[] args) {
        GroceryList_test addorder = new GroceryList_test();
        GroceryItemOrder(addorder);
    }
    public static void GroceryItemOrder(GroceryList_test addorder) {
        GroceryItemOrder_test Oranges = new GroceryItemOrder_test("oranges", 3, 2.46);
        System.out.println("Total cost of " + Oranges.itemID + " = $" + Oranges.getCost());
        addorder.add(Oranges);
        System.out.println();
        GroceryItemOrder_test Grapes = new GroceryItemOrder_test("grapes", 15, 0.55);
        System.out.println("Total cost of " + Grapes.itemID + " = $" + Grapes.getCost());
        addorder.add(Grapes);
    }
 }

メソッドGroceryItemOrder(GroceryList_test addorder)の下で:

GroceryItemOrder_test Oranges = new GroceryItemOrder_test("oranges", 3, 2.46);
System.out.println("Total cost of " + Oranges.itemID + " = $" + Oranges.getCost());
addorder.add(Oranges);

具体的には、ステートメントaddorder.add(Oranges);

これにより、アイテムを「item」で指定された「オブジェクト」として、add(GroceryItemOrder_test item)メソッドの下の配列に追加する必要があります。

これらは私が実行する方法を理解できない条件です。できれば助けてください。

私はまだこれに到達していないので、 ArrayListを提案しないでください。さらに調査すると、この目的では簡単に機能しないと思います。

4

1 に答える 1

0

私があなたの意味を理解しているなら、あなたは異なるオブジェクトGroceryListを保存したいと思うでしょう。GroceryItemOrder

あなたはあなたのコードに解決策を持っているところです。ただし、ここを見てください。

public void add(GroceryItemOrder_test item) {
    GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
    GroceryList[1] = item;
    System.out.println(GroceryList[1]);
}

これがどのように機能するかを追跡すると、メソッドを入力するたびに、add()10個の空の要素を含む新しい配列が作成されます。メソッドが終了すると、スコープ外になり、最終的にガベージコレクションが行われるため、これへのすべての参照がすぐに失われます。

これを回避するには、スコープ内にとどまる変数を使用する必要があります。GroceryList次のように、クラスのインスタンス変数をお勧めします。

public class GroceryList {

    private GroceryItemOrder[] list = null;

    public GroceryList() {
        list = new GroceryItemOrder[10];
    }

    public void add(GroceryItemOrder item) {
        for(int i=0; i<list.length; i++) {
            if(list[i] == null) {
                list[i] = item;
                System.out.println(item);
                break;
            }
        }
    }
}

このメソッドでは、新しい変数を作成するのではなく、add()既存の永続的な変数のみを確認します。listループして使用可能なスロット(ある場合)を見つけ、残りの処理を実行します。このbreakステートメントは、リスト内のすべてのアイテムが、追加する1つのアイテムに設定されないようにするために必要です。

次に、GroceryClientクラスは必要GroceryItemOrderに応じてオブジェクトを作成し、 (ので)のadd()メソッドを使用できます。GroceryListpublic

ArrayList投稿の最後のコメントであなたが言うこととは反対に、これは確かにはるかに簡単であることに注意してください。

于 2013-03-05T21:05:00.410 に答える