Как заполнить 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 шт):

Автор решения: Tokamo

Решил таким способом. Перебрал по кусочкам. Но код кажется каким-то огромным. Возможно будут у кого какие-либо замечания по коду и советы, буду рад увидеть.

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;
}
→ Ссылка