如何加入连接两个类并基于第三个“桥实体”打印报告[java]

时间:2012-11-05 06:57:03

标签: java collections

我有一些.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类。

这是我的目标:

我想创建一个库存报告,将三个列表合成为一个控制台打印输出,但是我想知道如何到达那里。

这就是我的意思:

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

我可能很接近,但我的逻辑就在这里......如何最好地根据第三类交叉引用两个类?

非常感谢帮助。

5 个答案:

答案 0 :(得分:3)

我认为你可以在下面做:

创建两个地图:

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

在阅读items时,使用itemMap作为密钥填充SKU,并使用Item对象作为值。同样,在阅读stores时,将storeMap填充为id作为关键字,将Store对象填充为值。

现在,当您阅读第二个文件时,分别使用Item和{{1}从StoreitemMap检索相应的storeMapSKU个对象并根据需要使用属性。

答案 1 :(得分: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());
    }
}

答案 2 :(得分:1)

不要进行顺序搜索,而应考虑使用地图。

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

    System.out.println(".....");
}

答案 3 :(得分: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

答案 4 :(得分:0)

不完全确定这里的*是什么,但我认为最简单的方法是创建一个包含所有三个值的合并对象,并将每个列表的值加载到此合并的各个项目中宾语。你加入他们的是显而易见的。正如你所说,这是一个最适合数据库的工作,但是如果你必须在纯java中使用它,我认为一个包含所有值的对象是可行的方法。