0

我有 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 吨原木分离器 399.99 0% 399.99

现在,要从 3 ArrayList 打印,我使用了相同的模式和 3 个循环:

public static void write(List items, List stores, List stock, 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

-描述|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 吨原木分离器|60-3823-0|39999|0

商店.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

股票.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

4

3 回答 3

2

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

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

于 2013-05-28T08:42:22.877 回答
1

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

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

顺便说一句,您不应该使用无类型参数,例如List itemsbut List<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 循环变成:

for (Item item : lists.get(0)) {
    for (Store store : lists.get(1)) {
        for (Stock stock : lists.get(2)) {
            ...
        }
    }
}
于 2013-05-28T08:42:27.897 回答
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()

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

于 2013-05-28T08:40:15.363 回答