#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;
});