Sum HashMap,ArrayList值(来自CSV)

时间:2017-06-04 13:32:48

标签: java csv arraylist

我试图创建一个java程序,我首先从csv文件读取行,然后将第二列添加到hashmap,第三列是值。

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

输入CSV(只是文件的开头):

466152;Product_69105;1
466152;Product_69133;6
466152;Product_69214;2
466152;Product_69216;2
466154;Product_01007;1
466154;Product_01083;1
466154;Product_01136;1
466154;Product_01155;1
466154;Product_01488;1
466154;Product_01491;1
466154;Product_01499;2
466154;Product_01513;1
466154;Product_01593;1
466154;Product_01646;1
466154;Product_01656;1
466154;Product_01688;1
466154;Product_01703;1
466154;Product_01770;1
466154;Product_01804;1
466154;Product_01909;1

.....

我的输出现在:

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

.....

Public class Tilausmäärä {

Map<String, List<Integer>> tuotteet;
String Tilausrivit = "tilausrivit.csv";
String Tilausrivit_2 = "abc.csv";

public Tilausmäärä() throws FileNotFoundException, IOException {
    tuotteet = new HashMap<>();
    readTilausrivitFile();
}

  public void readTilausrivitFile() throws FileNotFoundException, IOException {

    BufferedReader in = new BufferedReader(new FileReader(Tilausrivit));
    String line;

    while ((line = in.readLine()) != null) {
        String columns[] = line.split(";");
        String key = columns[1];
        int valueInt;
        List<Integer> valueList = null;

        try {
            valueInt = Integer.parseInt(columns[2]);
        } catch (NumberFormatException e) {
            System.out.println(e);
            continue;
        }

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

    } 

    in.close();
}

public static void main(String[] args) {
    try {
        Tilausmäärä tm = new Tilausmäärä();
        for (String k : tm.tuotteet.keySet()) {
            System.out.println(k + " " + tm.tuotteet.get(k));
        }


    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

可以使用一些帮助,所以任何好的想法都会受到赞赏。

谢谢!

2 个答案:

答案 0 :(得分:0)

  

文件中有重复的product_id(第二列)   有不同的值,所以我已将值添加到数组列表。

您可以使用相同的产品ID直接汇总值 您似乎不需要使用的列表。

您可能声明为tuotteet的{​​{1}}地图可能是Map<String, List<Integer>>,其中整数值将是总和。

填充ArrayList的实际代码:

Map<String, Integer>

可能是:

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

答案 1 :(得分:0)

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

这样的事情:

self.axes.set_position([0.2, 0.2, 0.6, 0.6]) # left,bottom,width,height