сгруппировать по дате java - PullRequest
0 голосов
/ 02 марта 2020

У меня есть csv-файл с примерно 500k наблюдениями формата «дата (LocalDate); час; значение; тип». Я должен выполнять операции с этими данными, такие как поиск средних значений, подсчет пропущенных значений, тип значения для интервала дат.

Я могу строить объекты почасового наблюдения, просматривая список строк:

new HourlyObs(date,hour,val,type);

Эти наблюдения проводятся ежечасно (хотя не 24 наблюдений в день, так как некоторые данные отсутствуют), но я думаю, что это было бы легче сгруппировать их по дате, а затем выполнить несколько бинарных поисков, учитывая функциональность, которую я должен был реализовать.

Поэтому я хотел создать массив объектов, где объекты спроектированы следующим образом:

class DailyObservation {

private LocalDate date;
private ArrayList<HourlyObs>; 

public float avgVal();
public int missingVals();
public float nrOfType();}

Существует ли «простой» и эффективный алгоритм для создания этого массива ежедневных наблюдений ? Я не могу обернуть голову вокруг этого, и мне не разрешено использовать потоки для агрегирования. Заранее большое спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Данные отсортированы?

Если он отсортирован, вы можете просто перебрать его, отследить изменение даты и соответственно создать новые объекты.

Если данные не отсортированы, то, вероятно, лучше всего создать Карту, в которой ключом является дата, а DailyObservation - это значение. Для каждой записи данных вы проверяете, существует ли уже объект на карте на определенную дату.

Редактировать:

Для отсортированных данных вы можете попробовать что-то вроде этого:

public List<DailyObservation> parseObservations(){
    List<DailyObservation> results = new ArrayList<>();
    DailyObservation current = new DailyObservation();
    String[] line;

    while((line=readLine()) != null){
        String dateString = line[0];
        LocalDate localDate = LocalDate.parse(dateString);

        if (!localDate.equals(current.getDate())){
            current = new DailyObservation();
            results.add(current);
        }

        HourlyObs hourlyObs = new HourlyObs();
        //
        //  assign data from lie to the hourlyObs however you want
        //      
        current.addHourlyObs(hourlyObs);
    }
    return results;
}
0 голосов
/ 02 марта 2020

Вы можете создать его следующим образом:

class DailyObservation {

    private LocalDate date;
    private Map<Integer, HourlyObservation> hourlyObservations = new HashMap<Integer, HourlyObservation>(); 

    public float avgVal();
    public int missingVals();
    public float nrOfType();

    public Map getHourlyObservations(){
        return hourlyObservations;
    }

    //Other setters and getters
}

В вашем main классе приложений:

DailyObservation do = new DailyObservation();
do.getHourlyObservations().put("13", new HourlyObservation(do.getDate(), 13, some value, some type));
do.getHourlyObservations().put("14", new HourlyObservation(do.getDate(), 14, some value, some type));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...