Как заполнить HashMap данными из txt файла

Мне нужно поместить следующие даты из файла Dates.txt в HashMap.

1 05.05.2017
2 11.12.2018
3 05.30.2020
4 03.15.2011
5 12.15.2000
6 10.30.2010
7 01.01.2004
8 12.31.1900
9 02.28.2014
10 10.10.2012

Формат HashMap должен быть

Начальная хэш-карта:

2017-05-05:1
2018-11-12:2
2020-05-30:3
2011-03-15:4
2000-12-15:5
2010-10-30:6
2004-01-01:7
1900-12-31:8
2014-02-28:9
2012-10-10:10

Мой фрагмент кода на данный момент

public class driver {
    public static void main(String[] args) throws FileNotFoundException {
        HashMap <LocalDate, Integer> dates = new HashMap <LocalDate, Integer>();
        Scanner s = new Scanner(new File("Dates.txt")); 
        while(s.hasNext())
        {
           dates.put(LocalDate.parse("mm.dd.yyyy"), Integer);
        }   

        System.out.println(dates);
    }
}

Мне сложно понять, что добавить в строку кода date.put(key,value), чтобы HashMap был отформатирован, как указано выше. Я не уверен, что было бы лучше прочитать текстовый файл в ArrayList, а затем использовать put() для заполнения HashMap. Любые рекомендации или ответы будут оценены!

3 ответа

Решение

Исходя из приведенных данных, похоже, что на самом деле нет причин использовать карту - как вы отметили, вы изо всех сил пытались найти подходящее значение. Вы можете накапливать их в ArrayList, или даже HashSet если порядок не важен.

Сделать это можно следующим образом:

Map<LocalDate, Integer> map = new HashMap<>();
Scanner s = new Scanner(new File("Dates.txt"));
while (s.hasNextLine()) {
    // Read a line
    String line = s.nextLine();
    // Split the line on whitespace
    String[] data = line.split("\\s+");
    if (data.length == 2) {
        map.put(LocalDate.parse(data[1], DateTimeFormatter.ofPattern("MM.dd.uuuu")), Integer.valueOf(data[0]));
    }
}
System.out.println(map);

Пример разбора строки даты в заданном шаблоне:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        LocalDate date = LocalDate.parse("05.05.2017", DateTimeFormatter.ofPattern("MM.dd.uuuu"));
        System.out.println(date);
    }
}

Вывод:

2017-05-05

Узнайте больше о современном API даты и времени на Trail: Date Time.

Как альтернатива уже предоставленному отличному ответу, это можно сделать с помощью потоков:

Map<LocalDate, Integer> result = Files.lines(Paths.get("Dates.txt")
    .map(l -> l.split(" ")).filter(fs -> fs.length == 2)
    .collect(Collectors.toMap(
         fs -> LocalDate.parse(fs[1], DateTimeFormatter.ofPattern("MM.dd.uuuu")), 
         fs -> Integer.valueOf(fs[0]));
Другие вопросы по тегам