Java 如何从3个列表读取到txt文件

Java 如何从3个列表读取到txt文件,java,arraylist,java-io,Java,Arraylist,Java Io,我有3个不同的物品、物品、商店和存货的数组列表。我试图从这些列表中读取并打印一个名为inventory的格式良好的txt文档。我的问题是阅读多个ArrayList。当我从一个列表中阅读和打印,但不是从多个列表中阅读和打印时,它工作得很好。我想不出来 这是我从单个列表打印时的代码 public static void write(List<Item> items, PrintStream out) { out.println(); out.println("Inven

我有3个不同的物品、物品、商店和存货的数组列表。我试图从这些列表中读取并打印一个名为inventory的格式良好的txt文档。我的问题是阅读多个ArrayList。当我从一个列表中阅读和打印,但不是从多个列表中阅读和打印时,它工作得很好。我想不出来

这是我从单个列表打印时的代码

public static void write(List<Item> items, PrintStream out) {

    out.println();
    out.println("Inventory Report");
    out.println("----------------");
    int i = 0;
    for (Item item : items) {
        out.format("%3d. %10s %50s %7.2f %3d%% %7.2f%n", ++i, item.getProductNumber(), item.getDescription(),
                (float) (item.getPrice() / 100.0), (int) (item.getDiscount() * 100),
                (float) (item.getSalePrice() / 100.0));
    }
}
}

但是我的输出没有给我任何东西:

库存报告 有人知道为什么它不打印任何东西吗?我真的不明白为什么。 多谢各位

编辑:

我的列表来自于我阅读的3个txt文档,可能这是错误的,但我不明白为什么它对其中一个有效,但对另一个无效。这是我的密码:

public static List<?> read(File file) throws ApplicationException {


    Scanner scanner = null;
    try {
        scanner = new Scanner(file);
    } catch (FileNotFoundException e) {
        throw new ApplicationException(e);
    }

    List<Item> items = new ArrayList<Item>();
    List<Store> stores = new ArrayList<Store>();
    List<Stock> stocks = new ArrayList<Stock>();

    try {
        scanner.nextLine();
        while (scanner.hasNext()) {
            String row = scanner.nextLine();
            String[] elements = row.split("\\|");
            if (file.getName().equals("items.txt") && elements.length != 4) {
                throw new ApplicationException(String.format("Expected 4 elements but got %d", elements.length));
            } else if (file.getName().equals("stores.txt") && elements.length != 8) {
                throw new ApplicationException(String.format("Expected 8 elements but got %d", elements.length));
            } else if (file.getName().equals("stock.txt") && elements.length != 3) {
                throw new ApplicationException(String.format("Expected 3 elements but got %d", elements.length));
            }
            try {
                if (file.getName().equals("items.txt")) {
                    items.add(new Item(elements[0], elements[1], Integer.valueOf(elements[2]), Float
                            .valueOf(elements[3])));
                } else if (file.getName().equals("stores.txt")) {
                    stores.add(new Store(elements[0], elements[1], elements[2], elements[3], elements[4],
                            elements[5], elements[6], elements[7]));
                } else if (file.getName().equals("stock.txt")) {
                    stocks.add(new Stock(elements[0], elements[1], Integer.valueOf(elements[2])));
                }
            } catch (NumberFormatException e) {
                throw new ApplicationException(e);
            }
        }
        LOG.info("Input file successfully parsed.");
    } finally {

        if (scanner != null) {
            scanner.close();
        }
    }
    LOG.info("List of Input created");

    return items;
}
公共静态列表读取(文件)引发ApplicationException{
扫描器=空;
试一试{
扫描仪=新扫描仪(文件);
}catch(filenotfounde异常){
抛出新的ApplicationException(e);
}
列表项=新建ArrayList();
列表存储=新建ArrayList();
列出股票=新的ArrayList();
试一试{
scanner.nextLine();
while(scanner.hasNext()){
字符串行=scanner.nextLine();
String[]elements=row.split(“\\\\”);
if(file.getName().equals(“items.txt”)&&elements.length!=4){
抛出新的ApplicationException(String.format(“预期有4个元素,但得到了%d”,elements.length));
}else if(file.getName().equals(“stores.txt”)&&elements.length!=8){
抛出新的ApplicationException(String.format(“需要8个元素,但得到了%d”,elements.length));
}else if(file.getName().equals(“stock.txt”)&&elements.length!=3){
抛出新的ApplicationException(String.format(“预期有3个元素,但得到了%d”,elements.length));
}
试一试{
if(file.getName().equals(“items.txt”)){
添加(新项(元素[0],元素[1],整数.valueOf(元素[2]),浮点
.价值(要素[3]);
}else if(file.getName().equals(“stores.txt”)){
添加(新存储(元素[0]、元素[1]、元素[2]、元素[3]、元素[4],
元素[5],元素[6],元素[7]);
}else if(file.getName().equals(“stock.txt”)){
添加(新股票(元素[0],元素[1],整数.valueOf(元素[2]));
}
}捕获(数字格式){
抛出新的ApplicationException(e);
}
}
info(“输入文件已成功解析”);
}最后{
如果(扫描器!=null){
scanner.close();
}
}
LOG.info(“创建的输入列表”);
退货项目;
}
以及我阅读的txt文档: Items.txt

-说明| SKU |零售价|折扣 -塔西莫T46家庭酿造系统| 43-0439-6 | 17999 | 0.30 -Moto精确安装后雨刮片| 0210919 | 799 | 0.0 -伊斯顿隐形反射复合曲棍球棒| 83-4567-0 | 8999 | 0.5 -Yardworks 4吨原木分离器| 60-3823-0 | 39999 | 0

Stores.txt

-ID |描述|街道|市|省|邮政编码|商店电话|汽车服务 -BC001 | GRANDVIEW&BENTALL | 2830 BENTALL Street |温哥华| BC | V5M 4H4 | 604-431-3570 | 604-431-3572 -BC002 |伯纳比南部| 7200市场交叉口|伯纳比| BC | V5J 0A2 | 604-451-5888 | 604-451-5888

Stock.txt

-门店ID |商品SKU |商品数量 -BC001 | 43-0439-6 | 25 -BC001 | 60-3823-0 | 63 -BC001 | 83-4567-0 | 15 -BC001 | 0210919-0 | 2 -BC002 | 43-0439-6 | 12 -BC002 | 60-3823-0 | 47 -BC002 | 83-4567-0 | 32
-BC002 | 0210919-0 | 0

也许您在格式化时出错了

%3d.    ++i
%10s    item.getProductNumber()
%50s    item.getDescription()
%7.2f   (float) (item.getRetailPrice() / 100.0)
%3d%%   (int) (item.getDiscount() * 100)
%7.2f   (float) (item.getSalePrice() / 100.0)
%5s     store.getStoreID()
%20s    store.getDescription()
%4d     stock.getItemCount()
%7.     item.getRetailPrice()
2%n"    stock.getItemCount()

//对不起,我刚刚发现了我的错误。

也许你在格式化时犯了一个错误

%3d.    ++i
%10s    item.getProductNumber()
%50s    item.getDescription()
%7.2f   (float) (item.getRetailPrice() / 100.0)
%3d%%   (int) (item.getDiscount() * 100)
%7.2f   (float) (item.getSalePrice() / 100.0)
%5s     store.getStoreID()
%20s    store.getDescription()
%4d     stock.getItemCount()
%7.     item.getRetailPrice()
2%n"    stock.getItemCount()

//抱歉,我刚刚发现了我的错误。

您的错误是您总是返回
项目
列表。因此其他列表将是空的。而且您的打印代码将无法工作,因为只有
列表不为空,其他列表为空。您可以在调试期间检查它


如果您想修复代码,则需要在返回时添加If语句,并根据文件名检查需要返回的列表

您的错误是总是返回
项目
列表。因此其他列表将是空的。而且您的打印代码将无法工作,因为只有
列表不为空,其他列表为空。您可以在调试期间检查它


如果您想修复代码,则需要在返回时添加If语句,并根据文件名检查需要返回的列表

你似乎只返回了
列表项目
,我认为你应该返回
列表你似乎只返回了
列表项目
,我认为你应该返回
列表我们需要看看列表来自何处,似乎商店或库存是空的。我说得对吗?如果每个列表有3个元素,那么文件中将有27行?这就是你想要的吗?我有3个txt文档,我从中读取并输出到每个列表中@Marek我想要的是每个项目一行。@Poupen。您的错误是您总是返回项目列表。因此其他列表将是空的。打印时的代码将无法工作,因为只有项目列表不为空,其他列表为空。您可以在调试期间检查它,因为它不够清晰。你想为一个项目得到一行,例如:这种类型的宝马汽车在那家商店与该股票。所以商品只能在一家商店里?我们需要看看清单是从哪里来的,看起来商店或存货都是空的。我说的对吗?如果每个列表有3个元素,那么文件中将有27行?这就是你想要的吗?我有3个txt文档,我从中读取并输出到每个列表中@Marek我想要的是每个项目一行。@Poupen。您的错误是您总是返回项目列表。因此其他列表将是空的。而且你的代码在打印时不起作用,因为只有
public static void write(List<List<?>> lists, PrintStream out);
List<List<?>> lists = new ArrayList<List<?>>();
List<Item> items = new ArrayList<Item>();
List<Store> stores = new ArrayList<Store>();
List<Stock> stocks = new ArrayList<Stock>();

try
{
    ...
}
lists.add(items);
lists.add(stores);
lists.add(stocks);

return lists;
public static List<List<?>> listOfList()
{
    List<List<?>> lists = new ArrayList<>();
    List<Integer> items = new ArrayList<>();
    List<Double> stores = new ArrayList<>();
    List<Float> stocks = new ArrayList<>();

    lists.add(items);
    lists.add(stores);
    lists.add(stocks);

    return (lists);
}
for (Item item : lists.get(0)) {
    for (Store store : lists.get(1)) {
        for (Stock stock : lists.get(2)) {
            ...
        }
    }
}