Java 求和HashMap、ArrayList值(来自CSV)

Java 求和HashMap、ArrayList值(来自CSV),java,csv,arraylist,Java,Csv,Arraylist,我试图制作一个java程序,首先读取csv文件中的行,然后将第二列添加到hashmap,第三列是值 文件中有重复的product_id(第二列),它们具有不同的值,因此我已将这些值添加到数组列表中。 现在我必须弄清楚如何从arraylist对这些值求和,然后将输出写入csv文件(新) 输入CSV(仅文件开头): 我现在的输出: Product_03067 [2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2] Product_82332 [1, 1, 1,

我试图制作一个java程序,首先读取csv文件中的行,然后将第二列添加到hashmap,第三列是值

文件中有重复的product_id(第二列),它们具有不同的值,因此我已将这些值添加到数组列表中。 现在我必须弄清楚如何从arraylist对这些值求和,然后将输出写入csv文件(新)

输入CSV(仅文件开头):

我现在的输出:

Product_03067 [2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2]
Product_82332 [1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, 2, 1, 2, 1, 1, 2, 1, 1]
Product_69594 [1, 1, 1, 1, 1, 1, 2, 2, 1, 1]
Product_82330 [1, 1, 1, 1, 3]
Product_03618 [1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 3, 1, 1, 1, 1, 
2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2]

想要的输出:

Product_03067, 20
Product_82332, 29
Product_69594, 12
Product_82330, 7

公共类Tilausmärä{
图奥泰特地图;
字符串Tilausrivit=“Tilausrivit.csv”;
字符串Tilausrivit_2=“abc.csv”;
public Tilausmärä()抛出FileNotFoundException,IOException{
tuotteet=newhashmap();
readTilausrivitFile();
}
public void readTilausrivitFile()引发FileNotFoundException、IOException{
BufferedReader in=新的BufferedReader(新文件读取器(Tilausrivit));
弦线;
而((line=in.readLine())!=null){
String columns[]=line.split(“;”);
字符串键=列[1];
int-valueInt;
List valueList=null;
试一试{
valueInt=Integer.parseInt(列[2]);
}捕获(数字格式){
系统输出打印ln(e);
继续;
}
if(集装箱箱(钥匙)){
valueList=tuoteet.get(键);
}否则{
valueList=新的ArrayList();
TUOTET.put(键、值列表);
}
valueList.add(valueInt);
} 
in.close();
}
公共静态void main(字符串[]args){
试一试{
Tilausmärätm=新的Tilausmärätm();
for(字符串k:tm.tuotteet.keySet()){
System.out.println(k+“”+tm.tuotteet.get(k));
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}

可能需要一些帮助,所以任何好的想法都会受到赞赏

谢谢

文件中有重复的产品id(第二列),该文件 具有不同的值,因此我已将这些值添加到数组列表中

您可以使用相同的产品id直接求和值。
您正在使用的列表似乎不是必需的

您的
tuoteet
映射可能声明为
map
可以是
map
,其中整数值为总和

填充ArrayList的实际代码:

 if (tuotteet.containsKey(key)) {
     valueList = tuotteet.get(key);
 } else {
     valueList = new ArrayList<>();
     tuotteet.put(key, valueList );    
 }
 valueList.add(valueInt);
文件中有重复的产品id(第二列),该文件 具有不同的值,因此我已将这些值添加到数组列表中

您可以使用相同的产品id直接求和值。
您正在使用的列表似乎不是必需的

您的
tuoteet
映射可能声明为
map
可以是
map
,其中整数值为总和

填充ArrayList的实际代码:

 if (tuotteet.containsKey(key)) {
     valueList = tuotteet.get(key);
 } else {
     valueList = new ArrayList<>();
     tuotteet.put(key, valueList );    
 }
 valueList.add(valueInt);

根据我对代码的理解(其中一部分缺失),您应该在tuotteet映射(其定义在您发布的代码中缺失)中将总数作为一个值,而不是列表。如果元素已在贴图中,则应增加其值,否则应将其值设置为当前值

大概是这样的:

Map<String, Integer> tuotteet;
...
    try {
        valueInt = Integer.parseInt(columns[2]);
    } catch (NumberFormatException e) {
        System.out.println(e);
        continue;
    }

    Integer val = null;
    if (tuotteet.containsKey(key)) {
        val = tuotteet.get(key) + valueInt;
    } else {
        val = valueInt;
    }
    tuotteet.put(key, val );
Map-tuotteet;
...
试一试{
valueInt=Integer.parseInt(列[2]);
}捕获(数字格式){
系统输出打印ln(e);
继续;
}
整数val=null;
if(集装箱箱(钥匙)){
val=tuotteet.get(键)+valueInt;
}否则{
val=valueInt;
}
TUOTTET.put(键,val);

根据我对您代码的理解(其中一部分缺失),您应该在tuotteet映射(其定义在您发布的代码中缺失)中将总数作为一个值,而不是列表。如果元素已在贴图中,则应增加其值,否则应将其值设置为当前值

大概是这样的:

Map<String, Integer> tuotteet;
...
    try {
        valueInt = Integer.parseInt(columns[2]);
    } catch (NumberFormatException e) {
        System.out.println(e);
        continue;
    }

    Integer val = null;
    if (tuotteet.containsKey(key)) {
        val = tuotteet.get(key) + valueInt;
    } else {
        val = valueInt;
    }
    tuotteet.put(key, val );
Map-tuotteet;
...
试一试{
valueInt=Integer.parseInt(列[2]);
}捕获(数字格式){
系统输出打印ln(e);
继续;
}
整数val=null;
if(集装箱箱(钥匙)){
val=tuotteet.get(键)+valueInt;
}否则{
val=valueInt;
}
TUOTTET.put(键,val);

如果目标是求和,为什么要将它们放在列表中,而不是在地图中直接求和?无论如何,您似乎知道如何构建一个映射,我非常确定您可以迭代映射的条目(或者至少,您应该能够通过阅读文档来了解这一点),并且您还应该能够对列表中的元素求和。把这三件事结合起来,你就有了你的解决方案。你想做什么样的输出?另一个CSV文件或只是终端打印?输出也应该是另一个CSV文件。我编辑了我的答案,添加了您要查找的代码。您可以将整数放入mapI,但我仍在努力将输出写入csv文件部分。我应该使用BufferedWriter还是用什么最有效的方法将输出写入csv?任何例子都感谢!如果目标是对值求和,为什么要将它们放在列表中,而不是在地图中直接求和?无论如何,您似乎知道如何构建一个映射,我非常确定您可以迭代映射的条目(或者至少,您应该能够通过阅读文档来了解这一点),并且您还应该能够对列表中的元素求和。把这三件事结合起来,你就有了你的解决方案。你想做什么样的输出?另一个CSV文件或只是终端打印?输出也应该是另一个CSV文件。我编辑了我的答案,添加了您要查找的代码。您可以将整数放入mapI,但我仍在努力将输出写入csv文件部分。我应该使用BufferedWriter还是用什么最有效的方法将输出写入csv?有什么例子吗
Map<String, Integer> tuotteet;
...
    try {
        valueInt = Integer.parseInt(columns[2]);
    } catch (NumberFormatException e) {
        System.out.println(e);
        continue;
    }

    Integer val = null;
    if (tuotteet.containsKey(key)) {
        val = tuotteet.get(key) + valueInt;
    } else {
        val = valueInt;
    }
    tuotteet.put(key, val );