2016-06-19 2 views
1

Я провел некоторое время, исследуя проблемы, похожие на мои, и теперь я застрял с моим кодом. Я выполнил основной читатель CSV файл, но я застрял в обработке на входКак назначить повторяющиеся элементы массива как уникальные ключи и подсчитать соответствующие целочисленные значения?

Текущий результат:

Source [medium = go bio , values = 5] 
Source [medium = go bio , values = 5] 
Source [medium = metal sink , values = 2] 
Source [medium = go bio , values = 5] 
Source [medium = metal sink , values = 3] 
Done 

Но то, что я хочу что-то вроде этого.

Выход:

[medium = go bio , values = 15] 
[medium = metal sink , values = 5] 

Содержимое моего текстового файла.

go,bio,5 
go,bio,5 
metal,sink,2 
go,bio,5 
metal,sink,3 

И это мой код:

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.FileReader; 
import java.util.HashMap; 

public class CVSReader { 
    public static void main(String[] args) { 
     CVSReader obj = new CVSReader(); 
     obj.run(); 
    } 

    public void run() { 
     String csvFile = "file2.txt"; 
     BufferedReader br = null; 
     String line; 
     String cvsSplitBy = ","; 
     String[] source; 

     try { 
      //HashMap here 
      HashMap<String, String> hash = new HashMap<>(); 
      HashMap<String, Integer> hash2 = new HashMap<>(); 

      br = new BufferedReader(new FileReader(csvFile)); 
      while ((line = br.readLine()) != null) { 
       // comma separator here 
       source = line.split(cvsSplitBy); 

       hash.put(source[0], source[0]); 
       hash.put(source[1], source[1]); 
       hash.put(source[2], source[2]); 

       System.out.println("Source [medium = " + hash.get(source[0]) + " " + 
         hash.get(source[1]) + " , values = " + hash.get(source[2]) + "]"); 
      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (br != null) { 
       try { 
        br.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     System.out.println("Done"); 
    } 
} 

ответ

1

Во-первых, вам нужно Map<String, Integer> к добавить свои записи с тем же ключом. Создайте ключ, проанализируйте значение из вашего line, и если он уже находится в Map, добавьте текущее значение к вашему анализируемому значению. Затем сохраните значение обратно в Map. Я бы также предпочел a try-with-resources close. Наконец, повторите команду Map.entrySet(). Нечто подобное,

String csvFile = "file2.txt"; 
String cvsSplitBy = "\\s*,\\s*"; // <-- adds support for white space(s) 
           //  before or after the comma. 
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { 
    Map<String, Integer> hash = new HashMap<>(); 

    String line; 
    while ((line = br.readLine()) != null) { 
     String[] source = line.split(cvsSplitBy); 
     String medium = source[0] + " " + source[1]; // <-- the key 
     int val = Integer.parseInt(source[2]);  // <-- the value 
     if (hash.containsKey(medium)) { // <-- is the key in Map? 
      val += hash.get(medium); // <-- yes, add the value. 
     } 
     hash.put(medium, val); // <-- store the value back in the Map. 
    } 
    // Iterate the entry set, display the "medium" and value. 
    for (Map.Entry<String, Integer> entry : hash.entrySet()) { 
     System.out.printf("Source [medium = %s , values = %d]%n", 
       entry.getKey(), entry.getValue()); 
    } 
} catch (IOException e) { // <-- FileNotFoundException is a sub-class. 
    e.printStackTrace(); 
} 
System.out.println("Done"); 

Что я побежал с текстовым файлом, и получил (по запросу)

Source [medium = metal sink, values = 5] 
Source [medium = go bio, values = 15] 
Done 
+0

Большого спасибо, комментарии, они очень информативны. Я буду больше читать об этом, еще раз спасибо! – shanxxix

Смежные вопросы