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

如何连接两个类并基于第三个“桥接实体”打印报告[java],java,collections,Java,Collections,我有一些.txt文件,我读入这些文件来构建两个对象 项目,带有字段: Description|SKU|Retail Price|Discount ID|Description|Street|City|Province|Postal Code|Store Phone|Auto Service 并与字段一起存储: Description|SKU|Retail Price|Discount ID|Description|Street|City|Province|Postal Code|Store

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

项目,带有字段:

Description|SKU|Retail Price|Discount
ID|Description|Street|City|Province|Postal Code|Store Phone|Auto Service
并与字段一起存储:

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

我可能很接近,但我的逻辑是错的。。。如何最好地在第三类的基础上交叉引用两个类


非常感谢您的帮助。

不完全确定这里的*点是什么,但我认为最简单的方法是创建一个合并对象,其中包含所有三个对象的值,并将每个列表的值加载到此合并对象的各个项中。很明显,你加入他们是武断的。正如您所说,这是一项最适合数据库的工作,但如果您必须使用纯java,我认为一个包含所有值的单一对象是最好的选择。

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

代替顺序搜索,考虑使用一个map。< /P>
for (Item it : items) {
    Stock stock = stockMap.get(it.getProductNumber());
    Store store = storeMap.get(stock.getStoreId());

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

<>而不是进行顺序搜索,考虑使用一个map。

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

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

我认为你可以做到以下几点:

将两个地图创建为:

    Map<String, Item> itemMap = new HashMap<String, Item>();
    Map<String, Store> storeMap = new HashMap<String, Store>();
读取项目时,使用SKU作为键和项目对象作为值填充itemMap。类似地,在读取存储时,使用id作为键填充storeMap,并将对象作为值存储


现在,当您读取第二个文件时,使用SKU和ID分别从itemMap和storeMap中检索相应的项和存储对象,并根据需要使用属性。

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

将两个地图创建为:

    Map<String, Item> itemMap = new HashMap<String, Item>();
    Map<String, Store> storeMap = new HashMap<String, Store>();
读取项目时,使用SKU作为键和项目对象作为值填充itemMap。类似地,在读取存储时,使用id作为键填充storeMap,并将对象作为值存储

现在,当您读取第二个文件时,使用SKU和ID分别从itemMap和storeMap中检索相应的项和存储对象,并根据需要使用属性。

假设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
假设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

将您的项目和商店存储在地图中,地图的Id是关键:

    Map<Integer, Item> items = new HashMap<Integer, Item>();
    Map<Integer, Store> stores = new HashMap<Integer, Store>();
将它们传递到您的输出方法,就很容易了:

编辑:在带有注释的行中有小错误,已修复


将您的项目和商店存储在地图中,地图的Id是关键:

    Map<Integer, Item> items = new HashMap<Integer, Item>();
    Map<Integer, Store> stores = new HashMap<Integer, Store>();
将它们传递到您的输出方法,就很容易了:

编辑:在带有注释的行中有小错误,已修复


问题是如何执行连接。我这里的for循环有问题。我希望有人能帮我。我不确定你的示例代码到底想加入什么,但不管是什么,你创建一个包含所有这些值的类,然后在各种列表中循环寻找特定字段值以匹配,然后将所有其他值拉入该对象的给定实例中。我明白了。如果只有两件事可以相互参照的话,这很容易,但我想我十年级的时候脑子里很难用三件事来概括。你能告诉我如何在第三个元素的基础上连接两个元素吗?你不需要一次完成所有操作。。。一次做一件事。首先循环第一个对象并将其与SKU打包,然后循环第二个对象以查找相同的SKU、零售价格、折扣和描述。然后循环浏览该列表,将其与第二个文件进行比较,并将其与第二组字段打包,最后循环浏览第三个文件以查找匹配的ID并将这些字段打包。现在您有了一个可以打印出来的合并对象列表
他确实加入了。我这里的for循环有问题。我希望有人能帮我。我不确定你的示例代码到底想加入什么,但不管是什么,你创建一个包含所有这些值的类,然后在各种列表中循环寻找特定字段值以匹配,然后将所有其他值拉入该对象的给定实例中。我明白了。如果只有两件事可以相互参照的话,这很容易,但我想我十年级的时候脑子里很难用三件事来概括。你能告诉我如何在第三个元素的基础上连接两个元素吗?你不需要一次完成所有操作。。。一次做一件事。首先循环第一个对象并将其与SKU打包,然后循环第二个对象以查找相同的SKU、零售价格、折扣和描述。然后循环浏览该列表,将其与第二个文件进行比较,并将其与第二组字段打包,最后循环浏览第三个文件以查找匹配的ID并将这些字段打包。现在你有了一个可以打印出来的合并对象列表;返回?这只是一个例子。改变到任何适合你的需要。例如,不要使用地图,而是使用地图。或者像我在回答中所做的那样,走简单的路;许多商店可以销售相同的产品,那么stockMap.getit.getProductNumber;返回?这只是一个例子。改变到任何适合你的需要。例如,不要使用地图,而是使用地图。或者像我在回答中所做的那样,走简单的路;我正在读取…中的.txt文件。。。我是否在读取中的每个项目时创建hashmap?我该怎么做?在开始阅读之前创建一次HashMap,然后填充它。创建项目后,调用items.putitem.getID,Item;,因此,不要像以前那样将项目放入列表中,而是将其放入地图中。我正在读取中的.txt文件。。。我是否在读取中的每个项目时创建hashmap?我该怎么做?在开始阅读之前创建一次HashMap,然后填充它。创建项目后,调用items.putitem.getID,Item;,因此,不要像以前那样将项目放入列表中,而是将其放入地图中。