对从 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中的comparablecomparator。 现在您可以简单地遍历列表并继续计算每个类别的小计。

有用的链接:Comarator v/s Comparable

【讨论】:

【参考方案2】:

    按类别对所有行进行排序。

    遍历排序列表并保留小计。

    如果项目与前一个项目属于不同类别,则发出小计行并清除小计值。 (您还必须在最后一行之后执行一次。)

    然后发出一行描述当前行。

要发出一个总计,只需保留另一个随每一行更新的总计并且从不清除。

【讨论】:

如何按类别对每一行进行排序? 通常的方法如下所示:Collections.sort(people, (a, b) -&gt; a.name.compareToIgnoreCase(b.name)); 将标识符适应您的示例。

以上是关于对从 csv 文件导入的数组列表进行小计的主要内容,如果未能解决你的问题,请参考以下文章

python如何导入数据

编译器是不是能够对从 dll 导入的函数进行程序集成?

SharePoint PowerShell 从CSV文件导入数据到列表

导入不断增长的 csv 文件列表(),仅在 imoprting 后追加 [重复]

错误 #1054 - 尝试将 CSV 文件导入数据库时​​,字段列表中出现未知列

Python 导入 csv 到列表