我有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文档中的输出:
现在,要从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
答案 0 :(得分:2)
你的错误在于你总是返回items
列表。所以其他列表将是空的。并且您的打印代码不起作用,因为只有items
列表不会将其他列表清空。你可以在调试期间检查它。
如果要修复代码,则需要在返回时添加if语句,并根据文件名检查需要返回的列表。
答案 1 :(得分:1)
看来你只返回List<Item> items
,我认为你应该返回一个List<List<?>>
或一个包装所有列表的类,然后像这样修改你的写原型:
public static void write(List<List<?>> lists, PrintStream out);
顺便说一句,您不应使用类似List items
但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 (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()
//对不起,我发现了我的错误。