1

我有一些 .txt 文件,我读入这些文件以构建两个对象。

项目,带字段:

Description|SKU|Retail Price|Discount

和存储字段:

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

我有另一个 .txt 文件用于 Inventory 对象,这是一个将它们联系在一起的桥梁实体。库存的字段是:

Store ID|Item SKU|Item Count

显然,这些来自 Item 和 Store 类。

这是我的目标:

我想创建一个库存报告,将三个列表合成为单个控制台打印输出,但我遇到了如何到达那里的问题。

据我所知,这大约是:

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 来完成...

我可能很接近,但我的逻辑在这里不正确......如何最好地交叉引用基于第三类的两个类?

帮助将不胜感激。

4

5 回答 5

3

我认为您可以执行以下操作:

创建拖车地图为:

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

在阅读 时items,填充itemMapusingSKU作为键和Item对象作为值。同样,在读取时,使用as 键和object 作为值stores填充。storeMapidStore

现在,当您读取第二个文件时,分别使用and检索相应的ItemStore对象,itemMap并根据需要使用属性。storeMapSKUID

于 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是唯一键。

您可以通过迭代多侧的条目并选择一侧的相应条目来执行多对一连接。在这里,您有一个可以迭代的表,即桥:

- 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

不完全确定这里的 *point 是什么,但我认为最简单的做法是创建一个合并对象,该对象将包含所有三个中的值,并将每个列表的值加载到此合并对象的各个项目中。显然,你加入他们是任意的。正如您所说,这是最适合数据库的工作,但如果您必须在纯 Java 中使用它,我认为保存所有值的单个对象是要走的路。

于 2012-11-05T07:01:43.717 回答