Saya mencoba membaca file teks dan menyimpannya dengan hashmap. File tersebut berisi informasi seperti ini:

1946-01-12;13:00:00;0.3;G 
1946-01-12;18:00:00;-2.8;G
1946-01-13;07:00:00;-6.2;G 
1946-01-13;13:00:00;-4.7;G
1946-01-13;18:00:00;-4.3;G 
1946-01-14;07:00:00;-1.5;G
1946-01-14;13:00:00;-0.2;G

Saya ingin menyimpan tanggal sebagai kunci dan kemudian "13:00:00;0.3;G" sebagai nilai, di mana 13:00 adalah waktu, 0,3 adalah suhu dan G mewakili kode kualitas. Saya ingin tahu apakah ini mungkin karena banyak baris dalam file memiliki tanggal yang sama? Saya sudah menulis kode untuk menyimpan data dalam daftar, tetapi sekarang saya ingin menyimpannya di peta. Kode lama saya terlihat seperti ini:

/**
 * Provides methods to retrieve temperature data from a weather station file.    
 */
public class WeatherDataHandler {

        private List<Weather> weatherData = new ArrayList<>();

        public void loadData(String filePath) throws IOException {
            List<String> fileData = Files.readAllLines(Paths.get("filepath"));
            for(String str : fileData) {
                List<String> parsed = parseData(str);
                LocalDate date = LocalDate.parse(parsed.get(0));
                LocalTime time = LocalTime.parse(parsed.get(1));
                double temperature = Double.parseDouble(parsed.get(2));
                String quality = parsed.get(3);
                
                //new Weather object
                Weather weather = new Weather(date, time, temperature, quality);
                weatherData.add(weather);       
            }
        }

        private List<String> parseData(String s) {
            return Arrays.asList(s.split(";"));
        }

Saya macet saat mengimplementasikan hashmap. Saya mulai dengan beberapa kode di bawah ini, tetapi saya tidak tahu cara mengulang urutan tanggal. Apa cara paling sederhana untuk menyimpan data dari file di peta?

public class WeatherDataHandler {
            public void loadData(String filePath) throws IOException {
                Map<LocalDate, String> map =new HashMap<LocalDate, String>();
                BufferedReader br = new BufferedReader(new FileReader("filepath"));
            String line="";
            int i=0;
            while (line != null) {
                line = br.readLine();
                map.put(i,line);
                i++;
            }
                String date="";
                String time="";
                String temperature="";
                String quality="";
                for(int j=0;j<map.size();j++){
                    if(!(map.get(j)== null)){
                        String[] getData=map.get(j).toString().split("\\,");
                        date = getData[0];
                        time = getData[1];
                        temperature = getData[2];
                        quality = getData[3];
                    }
                }
            }
0
Natalie_eds 7 Juli 2020, 22:28

1 menjawab

Jawaban Terbaik

Menggunakan API streaming Anda dapat membuat peta di mana kuncinya adalah tanggal dan nilai [map] adalah daftar.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class WeatherDataHandler {
    public static void main(String[] args) {
        Path path = Paths.get("filepath");
        try {
            Map<String, List<String>> map =  Files.lines(path)
                                                  .collect(Collectors.groupingBy(line -> line.split(";", 2)[0]));
            map.entrySet()
               .stream()
               .forEach(entry -> System.out.printf("%s = %s%n", entry.getKey(), entry.getValue()));
        }
        catch (IOException x) {
            x.printStackTrace();
        }
    }
}

Metode lines() di kelas java.nio.file.Files membuat aliran di mana setiap elemen aliran adalah satu baris file yang sedang dibaca.
Metode split() membagi baris menjadi array dua elemen (karena argumen kedua yang merupakan nomor 2).
Elemen larik pertama, yaitu tanggal, menjadi kunci [map] dan baris lainnya menjadi nilai [map].
Setiap kali kunci duplikat ditemukan, nilai ditambahkan ke nilai yang ada membuat daftar. Oleh karena itu parameter tipe untuk peta adalah String untuk kunci [map] dan List<String> untuk nilai [peta].

Menjalankan kode di atas pada hasil data sampel Anda:

1946-01-14 = [1946-01-14;07:00:00;-1.5;G, 1946-01-14;13:00:00;-0.2;G]
1946-01-12 = [1946-01-12;13:00:00;0.3;G , 1946-01-12;18:00:00;-2.8;G]
1946-01-13 = [1946-01-13;07:00:00;-6.2;G , 1946-01-13;13:00:00;-4.7;G, 1946-01-13;18:00:00;-4.3;G ]
0
Abra 7 Juli 2020, 19:55