1

2 つのオブジェクトを作成するために読み込んだ .txt ファイルがいくつかあります。

フィールドを持つ項目:

Description|SKU|Retail Price|Discount

フィールドを使用して保存します。

ID|Description|Street|City|Province|Postal Code|Store Phone|Auto Service

Inventory オブジェクト用に別の .txt ファイルがあります。これは、それらを結び付けるブリッジ エンティティです。インベントリのフィールドは次のとおりです。

Store ID|Item SKU|Item Count

明らかに、それらは Item クラスと Store クラスから来ています。

これが私の目的です:

3 つのリストを単一のコンソール印刷出力に合成するインベントリ レポートを作成したいのですが、そこに到達する方法について壁にぶつかっています。

これは私が得た限りです:

public static void write(List<Item> items, List<Store> stores, List<Stock> stocks) {
    System.out.println();
    System.out.println("Inventory Report");
    System.out.println("----------------");


    for (Item it : items) {
        for (Stock s : stocks) {
            if(it.getProductNumber() == s.getItemSKU()) {
                for (Store st: stores) {
                    if(st.getId() == s.getStoreID()) {
                        System.out.println(it.getDescription() + "is from store" + st.getId() + "in" + st.getCity()  + "and costs" + it.getPrice());
                    }
                }
            }
        }
    }
}

明らかな解決策はテーブルを作成して情報を入れることであることは知っていますが、これは純粋なJavaを使用して行うべきであるという課題です...

私はおそらく近いですが、私の論理はここで外れています.3番目のクラスに基づいて2つのクラスを相互参照するにはどうすればよいでしょうか?

助けていただければ幸いです。

4

5 に答える 5

3

以下でできると思います。

2 つのマップを次のように作成します。

    Map<String, Item> itemMap = new HashMap<String, Item>();
    Map<String, Store> storeMap = new HashMap<String, Store>();

を読みながら、キーとして使用し、値としてオブジェクトをitems入力します。同様に、 の読み取り中に、キーとしてオブジェクトを値として入力します。itemMapSKUItemstoresstoreMapidStore

ここで、2 番目のファイルを読み取るときに、対応するItemandStoreオブジェクトをitemMapandからstoreMapそれぞれ取得し、SKUandIDを使用して、必要に応じて属性を使用します。

于 2012-11-05T07:09:34.837 に答える
2

Id をキーとして、アイテムとストアをマップに保存します。

    Map<Integer, Item> items = new HashMap<Integer, Item>();
    Map<Integer, Store> stores = new HashMap<Integer, Store>();

それらを出力メソッドに渡すと、ケーキのように簡単です。

編集コメントのある行に小さなエラーがあり、修正しました。

public static void write(Map<Integer, Item> items, Map<Integer, Store> stores, List<Stock> stocks) {
    System.out.println();
    System.out.println("Inventory Report");
    System.out.println("----------------");

    for(Stock stock : stocks) { // <-- for all Stocks
        Store store = stores.get(stock.getStoreID()); // <-- get Store
        Item item = items.get(stock.getItemSKU());  // <-- get Item
        System.out.println(item.getDescription() + "is from store" + store.getId() + "in" + store.getCity()  + "and costs" + item.getPrice());
    }
}
于 2012-11-05T07:15:35.090 に答える
1

順次検索を行う代わりに、マップの使用を検討してください。

for (Item it : items) {
    Stock stock = stockMap.get(it.getProductNumber());
    Store store = storeMap.get(stock.getStoreId());

    System.out.println(".....");
}
于 2012-11-05T07:09:23.160 に答える
1

Item.SKUは一意のキーであると仮定します。

多面でエントリを反復し、一面で対応するエントリを選択することで、多対 1 結合を実行できます。ここに、反復できるテーブル、ブリッジがあります。

- build an index for the first table:
 - for every row, insert it to a map ID => row. You can use a HashMap
- build an index for the second table

- for every row in the bridge table
 - select the appropriate row in the first table using your index
 - select the appropriate row in the second table
 - print/store the data
于 2012-11-05T07:11:02.063 に答える
0

ここでの*ポイントが何であるかは完全にはわかりませんが、3つすべての値を含むマージされたオブジェクトを作成し、各リストの値をこのマージされたオブジェクトの個々のアイテムにロードするのが最も簡単だと思います. 何に参加するかは、明らかに恣意的です。おっしゃる通り、これはデータベースに最適な仕事ですが、純粋な Java で行う必要がある場合は、すべての値を保持する単一のオブジェクトが適していると思います。

于 2012-11-05T07:01:43.717 に答える