Есть ли способ разделить и отобразить дату на месяцы с их суммой ежедневного значения? - PullRequest
0 голосов
/ 19 января 2020

Мне трудно придумать, как создать функцию, которая может рассчитывать ежемесячные расходы всех объединенных проектов в системе и возвращать карту с месяцем в качестве ключа и ежемесячными расходами в качестве их значения. Под месячными затратами я подразумеваю количество рабочих часов сотрудников, умноженное на их заработную плату.

Класс Project имеет начальную дату и конечную дату с функцией, которая вычисляет промежуточные рабочие дни. Каждый проект имеет разные даты начала и окончания.

public int getNumWorkingDays() {
    return utils.Calendar.getNumWorkingDays(this.startDate, this.endDate);
}

В проекте также имеется функция commitHoursPerDay (), которая отображает сотрудника на количество отработанных часов в день.

private Map<Employee,Integer> committedHoursPerDay;

Как Могу ли я создать функцию, которая может суммировать расходы на основе каждого месяца с учетом даты начала и окончания каждого отдельного проекта?

Map<Month,Integer> monthlyBudget;

1 Ответ

3 голосов
/ 20 января 2020

Конечно, я не буду выполнять вашу работу по программированию за вас, но я могу дать вам несколько советов.

YearMonth

Чтобы обозначить месяц, используйте YearMonth класс.

YearMonth yearMonth = YearMonth.of( 2020 , Month.JANUARY ) ;

Вы можете получить YearMonth на любую дату.

LocalDate ld = LocalDate.of( 2020 , Month.MARCH , 27 ) ;
YearMonth yearMonth = YearMonth.from( ld ) ;

Этот класс можно использовать в качестве ключа вашей карты. Что касается части значения в парах ключ-значение карты, если вы говорите о дробных суммах валют, используйте BigDecimal для точность , никогда типы с плавающей точкой , с плавающей запятой или двойные.

Map< YearMonth , BigDecimal > monthlyTotals = new TreeMap<> () ;

Map реализации

Какую реализацию Map выбрать вам может понадобиться тот, который хранит ключи в хронологическом порядке этих YearMonth объектов. Если это так, выберите тот, который реализует NavigableMap. Две такие реализации связаны с Java 11: TreeSet и ConcurrentSkipListMap. Используйте второе, если вы манипулируете своей картой в разных потоках.

Вот таблица, которую я сделал, суммирующая особенности различных реализаций карты, связанных с Java 11.

Table of map implementations in Java 11, comparing their features

Прошедшие дни

Класс Project имеет начальную дату и конечную дату с функцией, которая вычисляет рабочие дни в интервале

Использование ChronoUnit класс для подсчета прошедших дней. Использует подход Half-Open, где начало включительно , а окончание эксклюзив .

LocalDate start = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalDate stop = LocalDate.of( 2020 , Month.FEBRUARY , 15 ) ;
long days = ChronoUnit.DAYS.between( start , stop ) ;

Если вы хотите пропустить определенные дни недели, чтобы считать только «рабочие дни», тогда выполните поиск переполнения стека , чтобы узнать больше, поскольку это было рассмотрено много раз. Вы, вероятно, захотите взглянуть на временные регуляторы в библиотеке ThreeTen-Extra .

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