2017-06-04 82 views
1

我想要製作一個Java程序,我首先從csv文件讀取行,然後將第二列添加到hashmap,第三列是值。Sum HashMap,ArrayList值(來自CSV)

文件中存在重複的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(); 
    } 
} 

}

可以使用一些幫助,所以任何好的想法表示讚賞。

謝謝!

+1

如果目標是,你爲什麼把他們總結的值列表,而不是直接概括他們,把他們在地圖上是什麼時候?無論如何,你似乎知道如何建立一個地圖,我敢肯定你可以迭代地圖的條目(或者至少,你應該能夠通過閱讀文檔來弄清楚),你也應該能夠總結一個列表的元素。結合這三件事情,你有你的解決方案。 –

+0

你想要做什麼樣的輸出?另一個CSV文件或只是一個終端打印? – Thecave3

+0

輸出也應該是另一個csv文件。 –

回答

0

存在重複PRODUCT_ID的(第二列)的文件,在其中 具有不同的值,所以我已經添加了值數組列表。

您可以直接將相同產品ID的值相加。
您使用的列表似乎不是必需的。

您的tuotteet映射可能被聲明爲Map<String, List<Integer>>可能是Map<String, Integer>其中整數值將是總和。

,你填充的ArrayList的實際代碼:

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

可能是:

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

似乎是這樣工作!實際上應該馬上將這個列表排除在外。感謝您的出色提示!現在我必須弄清楚如何將輸出寫入新的csv文件。 –

+0

我們經常做的事情比所需的更復雜。歡迎您和好運:) – davidxxx

0

從我從你的代碼(它的一部分缺失)明白,你應該有總數作爲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); 
+0

是的,抱歉部分代碼丟失了!現在添加... –