对从 csv 文件导入的数组列表进行小计
Posted
技术标签:
【中文标题】对从 csv 文件导入的数组列表进行小计【英文标题】:Subtotaling an arraylist that was imported from a csv file 【发布时间】:2019-11-27 06:56:19 【问题描述】:我正在为 Java 编码课程做一个学校项目,需要一些帮助
我已经导入了一个包含一些信息的 CSV 文件,该文件已被分成一个 ArrayList,并希望汇总文件中的每个不同类别。
现在我的输出是:
Item | Category | Amount | Price | Location
Carrots | Food | 12 | $2 | Walmart
Potatoes | Food | 15 | $3 | Walmart
T-Shirt | Clothes | 1 | $16 | Walmart
Toothbrush | Cleaning | 2 | $2 | Walmart
我的目标是获取每个类别的小计,例如:
Item | Category | Amount | Price | Location
Carrots | Food | 12 | $2 | Walmart
Potatoes | Food | 15 | $3 | Walmart
Subtotal for Food is: $69
T-Shirt | Clothes | 1 | $16 | Walmart
Subtotal for Clothes is: $16
Toothbrush | Cleaning | 2 | $2 | Walmart
Subtotal For Cleaning is: $4
然后最终将整个事情汇总到最后并显示如下:
Item | Category | Amount | Price | Location
Carrots | Food | 12 | $2 | Walmart
Potatoes | Food | 15 | $3 | Walmart
Subtotal for Food is: $69
T-Shirt | Clothes | 1 | $16 | Walmart
Subtotal for Clothes is: $16
Toothbrush | Cleaning | 2 | $2 | Walmart
Subtotal For Cleaning is: $4
Total is: $89
这是我现在的代码:
public static void main(String[] args)
ArrayList<output> csvstuff = new ArrayList<output>();
String fileName = "Project2.csv";
File file = new File(fileName);
try
Scanner inputStream = new Scanner(file);
while(inputStream.hasNext())
String data = inputStream.next();
String[] values= data.split(",");
String Item = values[0];
String Category = values[1];
String Amount = values[2];
String Price = values[3];
String Location = values[4];
String format = "%-10s |%10s |%10s |%10s |%10s\n";
System.out.printf(format, values[0], values[1], values[2], values[3], values[4]);
output _output = new output(Item,Category,Amount,Price,Location);
csvstuff.add(_output);
inputStream.close();
catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
【问题讨论】:
【参考方案1】:在循环中读取时不要打印值,而是像您所做的那样将其添加到arraylist。然后根据类别类型对数据进行排序。参考java中的comparable
和comparator
。
现在您可以简单地遍历列表并继续计算每个类别的小计。
有用的链接:Comarator v/s Comparable
【讨论】:
【参考方案2】:按类别对所有行进行排序。
遍历排序列表并保留小计。
如果项目与前一个项目属于不同类别,则发出小计行并清除小计值。 (您还必须在最后一行之后执行一次。)
然后发出一行描述当前行。
要发出一个总计,只需保留另一个随每一行更新的总计并且从不清除。
【讨论】:
如何按类别对每一行进行排序? 通常的方法如下所示:Collections.sort(people, (a, b) -> a.name.compareToIgnoreCase(b.name));
将标识符适应您的示例。以上是关于对从 csv 文件导入的数组列表进行小计的主要内容,如果未能解决你的问题,请参考以下文章
SharePoint PowerShell 从CSV文件导入数据到列表
导入不断增长的 csv 文件列表(),仅在 imoprting 后追加 [重复]