Чтение и форматирование данных в java - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть задание, где я должен читать данные из текстового файла. Данные в файле выглядят следующим образом:

1946-01-01;07:00:00;-1.8;G 1946-01-01;13:00:00;-1.0;G 1946-01-01;18:00:00;-1.9;G 1946-01-02;07:00:00;-1.7;G Я хочу отформатировать данные и поместить их в соответствующую структуру данных, чтобы затем можно было искать среднюю температуру для всех дат между двумя датами. Какой самый простой способ отформатировать эти данные, когда мой код:

package algo.weatherdata;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.List;

/**
 * Provides methods to retrieve temperature data from a weather station file.    
 */
public class WeatherDataHandler {
    /**
     * Load weather data from file.
     * 
     * @param filePath path to file with weather data
     * @throws IOException if there is a problem while reading the file
     */
    public void loadData(String filePath) throws IOException {
        //Read all weather data
        List<String> fileData = Files.readAllLines(Paths.get(filePath));

        /**
         * TODO: Format data and put it in appropriate data structure.
         */


    }

Ответы [ 3 ]

0 голосов
/ 23 февраля 2020

Предположим, что следующий класс будет содержать данные о погоде:

public class WeatherData {

    private LocalDateTime dateTime;
    private double temperature;
    private String tag;            // I don't really know what is 'G' mean

    public WeatherData(LocalDateTime dateTime, double temperature, String tag) {
        this.dateTime = dateTime;
        this.temperature = temperature;
        this.tag = tag;
    }
}

Далее мы анализируем файл данных в текущей структуре и собираем их все в список:

private List<WeatherData> 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);
        LocalDateTime dateTime = LocalDateTime.of(dateOf(parsed.get(0)), 
                                                  timeOf(parsed.get(1)));
        double temperature = Double.parseDouble(parsed.get(2));
        String tag = parsed.get(3);

        WeatherData weather = new WeatherData(dateTime, temperature, tag);
        weatherData.add(weather);
    }

}

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

private LocalDate dateOf(String date) {
    return LocalDate.parse(date);
}

private LocalTime timeOf(String time) {
    return LocalTime.parse(time);
}

И тогда вы можете работать со списком для поиска между датами и расчета средней температуры

0 голосов
/ 25 февраля 2020

Я пробовал выше Динар Зарипов кусок кода в моем рабочем пространстве с добавлением методов получения геттеров для dateTime, температуры и тега.

Продолжение после для l oop

private static float averageTemperature(List<WeaterData> weatherData) 
{

        float sum = 0; // Variable to store the sum
        float count = 0; // Variable to keep the count

        if (weatherList != null) {
            for (WeaterData averageWeather : weatherData) {
                float value = averageWeather.getTemperature();
                System.out.println(value);
                if (value <= 0) { // Check if the number is negative
                    sum += value; // Add the value to the current sum
                    count++; // Increment the count by 1
                }
            }

        }
        return (count > 0) ? (sum /count) : 0; // Calculate the average if there were any negative numbers
    }

Но я получаю среднее значение как ** среднее :: 1.5999999 ** Однако по математике это должно быть 1.6. может кто-нибудь сказать мне, как? или это правильно?

когда я даю данные ниже, я получаю правильное среднее значение:)

1946-01-01;07:00:00;-1.8;A
** 1946-01-01;13:00:00;-1.1; B**
1946-01-01;18:00:00;-1.9;C
1946-01-02;07:00:00;-1.7;D
0 голосов
/ 23 февраля 2020

Вы можете перебирать свои строки и разделять каждую строку разделителем (в вашем случае ;):

public void loadData(String filePath) throws IOException {
    List<String> fileData = Files.readAllLines(Paths.get(filePath));

    String[] lineValues = str.split(";");
    // line values are stored in this array
}

Затем вы можете делать с массивом, как вам нравится (сохранять их, обрабатывать их). ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...