Как заполнить HashMap из файла?
Есть файл с таким содержимым. Фамилия - ключ, а числа - значения.
Ivanov 2, 5, 10, 6, 8, 7.
Kozlov 7, 9, 10, 10, 8, 9.
Khimchenko 9, 10, 2, 8, 7, 6.
Alekseev 7, 7, 5, 8, 6, 9.
Задача состоит в том, что бы заполнить HashMap(key = фамилия, value = среднее арифметическое чисел). Проблема у меня состоит в понимании алгоритма. В похожих вопросах на форуме люди ставят разделитель, от которого можно отталкиваться. Так гораздо проще, но наличие разделителя формата key:value для меня не обязательно, поэтому стоит учитывать, что его вовсе может и не быть. Тоже самое касается и ,. Мне нужна помощь с алгоритмом, который правильно разделит key и values. Так как у меня нет собственных наработок, хочу попросить помощь в виде словесного объяснения алгоритма без написания кода(хочу понять и самостоятельно написать, а не "списывать" готовый код).
Ответы (1 шт):
Решил таким способом. Перебрал по кусочкам. Но код кажется каким-то огромным. Возможно будут у кого какие-либо замечания по коду и советы, буду рад увидеть.
public static Map<String, Double> getStudentsAverageMarks(String filePath) throws IOException {
List<String> list;
Map<String, Double> map = new HashMap<>();
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
String line;
String username = "";
double averageMark = 0;
while ((line = bufferedReader.readLine()) != null) { // считывание файла по 1 строке
list = Arrays.stream(line.replaceAll("[,.!?]", "").split("\\s")) // убрал все лишние разделители и разбил на элементы
.collect(Collectors.toList()); // собрал в список
for (int i = 0; i < list.size(); i++) { // начал перебирать лист
if (i == 0) {
username = list.get(i); // зная, что нулевой элемент это фамилия - сразу записываю его в соответствующую переменную
} else {
averageMark += Integer.parseInt(list.get(i)); // остальные элементы преобразую в числа и суммирую
}
}
averageMark = BigDecimal.valueOf(averageMark / (list.size() - 1)) // рассчитываю среднее значение и округляю до 1-го знака
.setScale(1, RoundingMode.HALF_UP).doubleValue();
map.put(username, averageMark); // закидываю в мапу
averageMark = 0; // обнуляю для следующей строки
}
return map;
}