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

时间:2013-05-28 08:21:19

标签: java arraylist java-io

我有3个不同的对象,物品,商店和库存的ArrayList。我正在尝试从这些列表中读取并打印一个名为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));
    }
}

这是我的txt文档中的输出:

库存报告

  1. 0210919 Moto Precise Fit后雨刮片7.99 0%7.99
  2. 83-4567-0 Easton Stealth Reflex复合曲棍球棒89.99 50%44.99
  3. 43-0439-6 Tassimo T46家庭酿造系统179.99 30%125.99
  4. 60-3823-0 Yardworks 4-Ton Log Splitter 399.99 0%399.99
  5. 现在,要从3个ArrayList打印,我使用了相同的模式和3个循环:

    public static void write(List items,List stores,List stocks,PrintStream out){

        out.println();
        out.println("Inventory Report");
        out.println("----------------");
        int i = 0;
        for (Item item : items) {
            for (Store store : stores) {
                for (Stock stock : stocks) {
                    out.format("%3d. %10s %50s %7.2f %3d%% %7.2f %5s %20s %4d %7.2%n", ++i, item.getProductNumber(), item.getDescription(),
                            (float) (item.getRetailPrice() / 100.0), (int) (item.getDiscount() * 100),
                            (float) (item.getSalePrice() / 100.0), store.getStoreID(), store.getDescription(),
                            stock.getItemCount(), item.getRetailPrice() * stock.getItemCount());
                }
            }
        }
    }
    

    }

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

    库存报告

    任何人都有任何想法为什么它不打印任何东西?我真的不明白为什么。 谢谢

    修改

    我的列表来自我读过的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;
    }
    

    我读取的txt文档: Items.txt

    -Description | SKU |零售价|折扣 -Tassimo T46家庭酿造系统| 43-0439-6 | 17999 | 0.30 -Moto Precise Fit后雨刮片| 0210919 | 799 | 0.0 -Easton Stealth Reflex复合曲棍球棒| 83-4567-0 | 8999 | 0.5 -Yardworks 4-Ton Log Splitter | 60-3823-0 | 39999 | 0

    Stores.txt

    -ID |描述|街道|城市|省|邮政编码|店铺电话|汽车服务 -BC001 | GRANDVIEW&amp; BENTALL | 2830 Bentall Street |温哥华| BC | V5M 4H4 | 604-431-3570 | 604-431-3572 -BC002 | BURNABY SOUTH | 7200 Market Crossing |本拿比| BC | V5J 0A2 | 604-451-5888 | 604-451-5888

    stock.txt中

    -Store ID | Item 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

3 个答案:

答案 0 :(得分:2)

你的错误在于你总是返回items列表。所以其他列表将是空的。并且您的打印代码不起作用,因为只有items列表不会将其他列表清空。你可以在调试期间检查它。

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

答案 1 :(得分:1)

看来你只返回List<Item> items,我认为你应该返回一个List<List<?>>或一个包装所有列表的类,然后像这样修改你的写原型:

public static void write(List<List<?>> lists, PrintStream out);

顺便说一句,您不应使用类似List itemsList<Items> items的非类型参数。

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;

使用JDK 7为我编译:

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)) {
            ...
        }
    }
}

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

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