obliczenie dni jakie upłynęły od daty [stream]

obliczenie dni jakie upłynęły od daty [stream]
Michał Bała
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:7
0

Wtiam serdecznie
Kolejny stack w mojej nauce i pytanie do doświadczonych kolegów:
Celem zadania jest "obliczenie średniej liczby dni, jaka upłynęła od zlecenia wykonania zadania do dnia bieżącego w liście zadań"

Utworzone zostały klasy User, Task, taskList i Board zwracające odpowiednio użytkownika (Konstruktor: final String username, final String realName) zadania ( final String title, final String description, final User assignedUser, final User creator final LocalDate created, final LocalDate deadline), listy zadań (String name), i dashboard (String name).
W test suite utworzony zbiór danych testowych prepareTestData (dane podane przez instruktorów) na którym mamy pracować.

Kod jaki stworzyłem wygląda następująco:
...
@Test
void testAddTaskListAverageWorkingOnTask(){
//Given
Board project = prepareTestData();
Period period = new Period();

           //When
            List<TaskList> inProgessTasks = new ArrayList<>();
            inProgessTasks.add(new TaskList("In progress"));
            double averageDaysPassedSinceTaskCreation = project.getTaskLists().stream()
                    .flatMap(tl -> tl.getTasks().stream())
                    .map(Task::getCreated)
                    .Task.period.between(LocalDate.now(), created)
                    .average().getAsDouble();

            //Then
            assertEquals(2.5, averageDaysPassedSinceTaskCreation);
        }
    ...

I niestety podejście z period w takiej postaci się nie sprawdziło.

Pocieszam się tym, że to 3 poprzednie przypadki testowe udało mi się ogarnąć - ale ten mnie pokonał XD.
Jakieś rady

edytowany 1x, ostatnio: Michał Bała
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9916962)
FB
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:3
0

periodem tego chyba nie ogarniesz, spróbuj w ten sposób może:

Kopiuj
LocalDate localDateStartDate = LocalDate.of(2016, 06, 10);
LocalDate localDateEndDate = LocalDate.of(2016,06,23);
long days = ChronoUnit.DAYS.between(localDateStartDate, localDateEndDate);

więcej tu:
https://stackoverrun.com/pl/q/8484800

edytowany 1x, ostatnio: FrancoBellucci
Michał Bała
To się da wyciągnąć ze strumienia forEachem? czy lepiej collect toMap i osobno pętelkę?
FB
az tak nie ogarniam, po prostu sam wczoraj sie z tym bujałem i takie rozwiązanie znalazlem ;)
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Przy testach w JUnit i double trzeba brać pod uwagę prezycję.


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
BraVolt
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Warszawa
  • Postów:2918
1

Pierwsze danie:
Zrób przypadek dla jednego taska i policz średnią
Zrób przypadek dla dwóch tasków i policz średnią
Zrób przypadek dla braku tasków i policz średnią

Na drugie danie:
https://www.baeldung.com/hamcrest-number-matchers
https://www.baeldung.com/parameterized-tests-junit-5

Zrób zadanie klasycznie, bez .stream(), napisz testy.
Zrób wersję o jaką pytasz, testy już masz.

Metodą "na bootcampa" (W test suite utworzony zbiór danych testowych prepareTestData (dane podane przez instruktorów) na którym mamy pracować.) daleko nie zajdziesz.

PS
Na podstawie prostego przykładu zbuduj sobie swoje zadanie.
Domyśliłem się, bo danych nie ma, że masz policzyć średnią dla wszystkich Users.
Wtedy dla wszystkich do wzięcia opóźnienie, zsumowanie opóźnień, podzielenie podzielenie przez liczbę wszystkich tasków.

Istotna uwaga
Średnia średnich 'częściowych' != średniej całości

np
a) 1, 1, 1, 2, 2; średnia = 1,4
b) 1, 1, 1; średnia = 1
c) 2, 2; średnia = 3

średnia 1 i 3 = 2
2 != 1,4

*Dlatego wałkowane jest flatMap, bo nie można zrobić suma średnich / liczba średnich żeby otrzymać średnią wszystkich tasków
*

Kopiuj
package pl.bv.p69;

import java.time.LocalDate;

public class Task {

    private final LocalDate submitted;

    public Task(LocalDate submitted) {

        this.submitted = submitted;
    }

    public LocalDate getSubmitted() {

        return submitted;
    }
}
Kopiuj
package pl.bv.p69;

import java.time.LocalDate;
import java.time.Month;
import java.util.List;

public abstract class Boss {

    public static List<Task> getTaskList() {

        return List.of(
                new Task(LocalDate.of(2020, Month.OCTOBER, 20)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 21)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 22)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 23)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 24)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 25)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 26)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 27)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 28)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 29)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 30)),
                new Task(LocalDate.of(2020, Month.OCTOBER, 31))
        );
    }
}
Kopiuj
package pl.bv.p69;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.List;

public abstract class Clerk {

    public static double getAverageDelay() {

        final List<Task> taskList = Boss.getTaskList();

        int total = 0;
        for (Task task : taskList) {
            final LocalDate submitted = task.getSubmitted();
            final LocalDate today = LocalDate.now();
            total += ChronoUnit.DAYS.between(submitted, today);
        }

        return (double) total / taskList.size();
    }

    public static double calculateAverageDelay() {

        return Boss.getTaskList()
                .stream()
                .map(Task::getSubmitted)
                .mapToLong(Clerk::betweenDays)
                .average()
                .orElse(0.0);
    }

    private static long betweenDays(LocalDate submitted) {

        return ChronoUnit.DAYS.between(submitted, LocalDate.now());
    }
}


"Kiedy wiedzieć czy zacząć nauke Springa? bo w czystej Javie to nic ciekawego nie zrobie chyba"
Ein Volk, ein Reich, ein Kwa-Kwa ***** ***
edytowany 2x, ostatnio: BraVolt

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.