Есть ли простой способ проанализировать текстовый файл с 4 столбцами для суммирования / усреднения значений с соответствующим первым значением?

#java

#java

Вопрос:

У меня есть текстовый файл, из которого я удалил посторонние данные, оставив меня 4 columns . Первый действует как a state identifier , и каждый из следующих трех содержит numerical information информацию о населении этого состояния.

Это моя первая игра, IO/file parsing и у меня, похоже, возникают проблемы с поиском решения для определения того, какие строки имеют одинаковый идентификатор состояния, а затем суммирования значений столбцов 2, 3 и 4.

Пример того, как это может выглядеть в качестве входных данных:

 01   123   456   789
01   456   789   012
 

и так далее

Пример того, что я хотел бы видеть в качестве вывода:

01 579 1245 801

Я попытался перейти построчно и splitting содержимое моего входного файла в a string array , чтобы затем Integer.parseInt() преобразовать содержимое моей строки в целые числа.

Совсем недавно я попытался собрать a while loop для медленного перебора моих данных с намерением создать array значения только в этой строке, чтобы я мог сохранить их для выполнения моего summations/averages . .

 int stateCode = 01;
while (stateCode <= 56) {                   
    if (line.startsWith(Integer.toString(stateCode))) {  
                System.out.println(stateCode);                          
            String[] stringValues = line.split("    ");                 
        for (int i = 0;   i < stringValues.length; i  ) {                                
                       System.out.println(stringValues[i]);             
               }
        }   
        stateCode  ;            
    }
 

Описано то, что я хотел бы видеть выше! Действительно чувствую, что я приближаюсь к этому вопросу, но хотел бы посмотреть, какие решения другие могут рассмотреть для использования. Цените вклад, все!

Комментарии:

1. Если я правильно вас понимаю, для каждой строки, которую вы читаете, вы хотите определить, для какого состояния предназначены числа с первым значением, а затем добавить следующие 3 к уже существующим значениям состояния? Может быть задание для 2D-массива, где arr[statecode][0-2] может содержать данные.

2. Да, это цель. Столбцы 2-4 представляют собой разные статистические данные о населении, и цель состоит в том, чтобы скомпилировать все значения для состояния один вместе. Я попробую 2d-массив!

Ответ №1:

Я дам вам общую идею, которая может облегчить вашу работу.

 01 123 456 789
 

Эта строка может быть представлена в виде Entry<Integer, IntSummaryStatistics> , ключ — это код состояния, значение — это статистика об этом состоянии.

 Integer stateCode = Integer.valueOf(line.substring(0, line.indexOf(' ')));
IntSummaryStatistics statistics = Arrays.stream(line.substring(line.indexOf(' ')).split(" "))
                                        .filter(s -> !s.isEmpty())
                                        .mapToInt(Integer::valueOf)
                                        .summaryStatistics();
 

Имея эти два значения, вы можете сформировать recond и поместить его в a Map .

 map.put(stateCode, statistics);
 

Вы переходите к следующим элементам и проверяете, была ли уже рассчитана статистика для обрабатываемого состояния. Если это так, вы вычисляете новый и объединяете их.

 map.compute(stateCode, (key, oldValue) -> {
    if (oldValue == null) {
        return statistics;
    }
    oldValue.combine(statistics);
    return oldValue;
});