Łączenie elementów z listy

Odpowiedz Nowy wątek
2020-04-06 18:51

Rejestracja: 2 lata temu

Ostatnio: 2 tygodnie temu

0

Witam. Jak w temacie. Mam dwie listy. W jednej przechowuję daty (LocalDate) a w drugiej minuty (Integer).
W jaki sposób przypisać do konkretnej daty konkretne minuty? Dodam, że minuty docelowo chcę aby były zsumowane i wyświetlone.
Efekt jaki chcę uzyskać to wyświetlenie danych w formacie:
Data - minuty.

public class Times {

    private int hours;
    private int minutes;

    public Times(){}

    public int getHours() {
        return hours;
    }

    public void setHours(int hours) {
        this.hours = hours;
    }

    public int getMinutes() {
        return minutes;
    }

    public void setMinutes(int minutes) {
        this.minutes = minutes;
    }

    public int addTimes(int resum){
        resum += (hours * 60) + minutes;
        return resum;
    }

}
public class Dates {
    static final int ADD_TIMES = 1;
    static final int PRINT_DATE = 2;
    static final int EXIT = 0;

    List<LocalDate> dateList = new ArrayList<>();
    List<Integer> minutesList = new ArrayList<>();
    Times times = new Times();
    Scanner sc = new Scanner(System.in);

    int options = -1;
    int resum = 0;

    public void ControlLoop() {
        while (options != EXIT) {
            printOptions();
            System.out.print("Wybierz opcję: ");
            options = sc.nextInt();
            sc.nextLine();

            switch (options) {
                case ADD_TIMES:
                    System.out.print("Podaj datę w formacie [dd-MM-yyyy]: ");
                    DateTimeFormatter datePattern = DateTimeFormatter.ofPattern("dd-MM-yyyy");
                    String dateInput = sc.nextLine();
                    LocalDate createDate = LocalDate.parse(dateInput, datePattern);
                    dateList.add(createDate);
                    System.out.print("Podaj liczbę godzin: ");
                    times.setHours(sc.nextInt());
                    System.out.print("Podaj licznę minut: ");
                    times.setMinutes(sc.nextInt());
                    int add = times.addTimes(resum);
                    minutesList.add(add);
                    break;
                case PRINT_DATE:
                    printAll();
                    break;
                case EXIT:
                    System.out.println("PAPA!");
                    break;
                default:
                    System.out.println("Nie ma takiej opcji!");
            }

        }
        sc.close();

 public void printOptions(){
        System.out.println("Dostępne opcje:");
        System.out.println("1-Dodaj godziny nadliczbowe.");
        System.out.println("2-Wyświetl zapisane dane.");
        System.out.println("0-Wyjdz z programu.");
    }
    }
edytowany 4x, ostatnio: luki25591, 2020-04-06 18:54

Pozostało 580 znaków

2020-04-06 19:04

Rejestracja: 1 rok temu

Ostatnio: 6 godzin temu

1

Nie dwie listy, ale jedna, gromadząca pary.

Najprościej taką parę zrealizujesz jako

class MyPair {
  public final LocalDate date;
  public final Times time;
  public MyPair (LocalDate  d, Times  t){
      this.date = d;
      this.time = t;
  }
}

i potem

List<MyPair> llist = new ArrayList<>();
edytowany 2x, ostatnio: AnyKtokolwiek, 2020-04-06 19:08

Pozostało 580 znaków

2020-04-06 19:22

Rejestracja: 1 rok temu

Ostatnio: 4 godziny temu

0

Dlaczego nie możesz użyć na starcie LocalDateTime? https://docs.oracle.com/javas[...]/java/time/LocalDateTime.html

Będziesz miał minuty dopasowane do daty.

Mi to pachnie, jakby wprowadzał zaległe dane, gdzie minuty nie są godziną na zegarku (czasem), ale ilością minut nadliczbowych - AnyKtokolwiek 2020-04-06 19:23

Pozostało 580 znaków

2020-04-07 10:18

Rejestracja: 2 lata temu

Ostatnio: 2 tygodnie temu

0

Dlatego, że przeliczam godziny na minuty i dodaję do minut. Docelowo chcę aby wszystkie minuty w liście były zsumowane.

Zrobiłeś tą parę? - AnyKtokolwiek 2020-04-07 10:20
Ok, dopiero teraz zrozumiałem. Konkretnemu dniu chcesz przydzielić ILOŚĆ minut, a nie konkretną godzinę z minutami. - kixe52 2020-04-07 10:38
Dokładnie tak :-) - luki25591 2020-04-07 10:48

Pozostało 580 znaków

2020-04-07 15:21

Rejestracja: 2 lata temu

Ostatnio: 2 tygodnie temu

0
AnyKtokolwiek napisał(a):

Nie dwie listy, ale jedna, gromadząca pary.

Najprościej taką parę zrealizujesz jako

class MyPair {
  public final LocalDate date;
  public final Times time;
  public MyPair (LocalDate  d, Times  t){
      this.date = d;
      this.time = t;
  }
}

i potem

List<MyPair> llist = new ArrayList<>();

Możesz wyjaśnić w jaki sposób dodać Twoje rozwiązanie? Rozumiem jak ma to działać ale nie bardzo wiem jak to dodać.

zamiast czego? - luki25591 2020-04-07 15:30
zamiast dwóch list, najogólniej mówiąc. Jak skasujesz stare, sam zobaczysz co i jak. Oczywiście do nowej listy dodajesz list.add(new MyPair (... , ...)); - AnyKtokolwiek 2020-04-07 15:33

Pozostało 580 znaków

2020-04-07 19:49

Rejestracja: 2 lata temu

Ostatnio: 2 tygodnie temu

0

Udało się dodać do jednej listy godziny i minuty w formacie "Data: ........, godziny: ............, minuty: ............".
Mając poniższą metodę w klasie Times przeliczam godziny na minuty i dodaję do minut jednak nie wiem jak ją zaimplementować aby działała.

public int addTimes(int resum){
        resum += (hours * 60) + minutes;
        return resum;
    }

Tutaj zmieniona pętla while:

switch (options) {
                case ADD_TIMES:
                    System.out.print("Podaj datę w formacie [dd-MM-yyyy]: ");
                    DateTimeFormatter datePattern = DateTimeFormatter.ofPattern("dd-MM-yyyy");
                    String dateInput = sc.nextLine();
                    LocalDate createDate = LocalDate.parse(dateInput, datePattern);
                    System.out.print("Podaj liczbę godzin: ");
                    times.setHours(sc.nextInt());
                    System.out.print("Podaj licznę minut: ");
                    times.setMinutes(sc.nextInt());
                    times.addTimes(resum);//chodzi konkretnie o tą metodę
                    list.add(new MyPair(createDate, times));//tutaj dodaję nowy obiekt z datą, godzinami i minutami a chcę żeby przeliczał jaka jest liczba minut
                    break;
                case PRINT_DATE:
                    printAll();
                    break;
                case EXIT:
                    System.out.println("PAPA!");
                    break;
                default:
                    System.out.println("Nie ma takiej opcji!");
            }

        }
edytowany 1x, ostatnio: luki25591, 2020-04-07 19:53
Mówisz w klasie? To daj, jak ona teraz wygląda, bo jestem zdezorientowany - AnyKtokolwiek 2020-04-07 20:17
nie wykorzystujesz wartości zwróconej z addTimes(), być może to ten błąd??? Ale to już odchodzi, nieważne - AnyKtokolwiek 2020-04-07 20:45

Pozostało 580 znaków

2020-04-07 20:24

Rejestracja: 2 lata temu

Ostatnio: 2 tygodnie temu

0
package system;

import java.time.LocalDate;

public class Times {

    private int hours;
    private int minutes;

    public Times(){}

    public int getHours() {
        return hours;
    }

    public void setHours(int hours) {
        this.hours = hours;
    }

    public int getMinutes() {
        return minutes;
    }

    public void setMinutes(int minutes) {
        this.minutes = minutes;
    }

    public int addTimes(int resum){
        resum += (hours * 60) + minutes;
        return resum;
    }

    @Override
    public String toString() {
        return "minuty: " + minutes;
    }
}
edytowany 1x, ostatnio: luki25591, 2020-04-07 20:24

Pozostało 580 znaków

2020-04-07 20:38

Rejestracja: 1 rok temu

Ostatnio: 6 godzin temu

0

Wg mojego wyczucia Twojego zagadnienia, i zasad OOP, w szczególności w Javie.
Szczególnie jedną zasadę podkreślę: zakresy odpowiedzialności klas.

Times jest pojemnikiem (żeby nie użyć słowa kontener ;) ) na dane podstawowe, i NIE JEST (wg mnie) jego zakresem odpowiedzialności sumować z czymś.
Nie jest dobrze używać obiektu klasy X aby sumować X. Suma to suma, jakościowo coś innego od obiektu. Koszyk jabłek to nie jabłko.
Tam był jeszcze inny błąd, ale nie mówmy o kodzie, który odchodzi w niebyt.

Zsumujesz sobie na zewnątrz biorąc asMinutes();

int sum = 0;
for(var x:list) {  // po zbudowaniu listy, var jest w Javie >=10 . Można też lambdą (>=8) , ale nie chce za dużo na raz
    sum += x.asMinutes();
}

Po drugie zmieniłem klasę na niezmienniczą (immutable). Jak poprzednio, zostawiam tobie przyjemność dostosowania maina()

package system;

import java.time.LocalDate;

public class Times {

    private final int hours;
    private final int minutes;

    public Times(int h, int m)
    {
          this.hours = h;
          this.minutes = m;
    }

    public int getHours() {
        return hours;
    }

//     public void setHours(int hours) {
//        this.hours = hours;
//    }

    public int getMinutes() {
        return minutes;
    }

 //   public void setMinutes(int minutes) {
   //     this.minutes = minutes;
   // }

    //public int addTimes(int resum){
      //  resum += (hours * 60) + minutes;
       // return resum;
    //}

    @Override
    public String toString() {
        return "minuty: " + (hours *60 + minutes);
    }

   public int asMinutes(){
      return 60*hours+minutes;
   }
}
edytowany 1x, ostatnio: AnyKtokolwiek, 2020-04-07 20:41
Dzięki za pomoc. Pierwotnie miałem napisałem bardzo podobnie. Jednak wydawało mi się to nie dość ładn. O jakim błędzie mówiłeś? Dzięki błędom człowiek się uczy. Co do sumowania zamierzałem użyć lambdy ale najpierw chciałem uporać się z dodaniem w formie minut do listy. - luki25591 2020-04-07 21:02
Z zawodu nie jestem programistą ale traktuję to jako hobby. Wolne chwile poświęcam na programowanie chociaż czasu zbyt wiele nie ma. - luki25591 2020-04-07 21:04
Dobry jesteś, chce Ci się, i się rozwijasz. Komuś takiemu jest frajda coś podpowiedzieć. - AnyKtokolwiek 2020-04-07 21:08

Pozostało 580 znaków

2020-04-07 22:06

Rejestracja: 5 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Warszawa

1

@luki25591:
IMO nie potrzebujesz żadnej klasy na minity i sekuny tylko ja bym wykorzystał gotową klasę Duration
No i jeżeli chcesz łaczyć długość czasu z datą to sensowne wydaje się użycie Mapy do tego
Pozdrawiam cieplutko :)


Nie pomagam przez PM. Pytania zadaje się na forum.
Zakładam, że daty będą mogły się powtarzać więc jeśli kluczem będzie data to mapa odpada. Klasy Duration nie znam ale chętnie się z nią zapoznam i sprawdzę jakie są jej możliwości. - luki25591 2020-04-08 11:47
Nie odpowiadaj w komentarzach :( - scibi92 2020-04-08 12:35

Pozostało 580 znaków

2020-04-08 23:02

Rejestracja: 5 lat temu

Ostatnio: 4 godziny temu

Lokalizacja: Warszawa

0

@luki25591:
Napisałeś

W jaki sposób przypisać do konkretnej daty konkretne minuty? Dodam, że minuty docelowo chcę aby były zsumowane i wyświetlone.

Nie wiem czy codzi o minuty per data czy ogólnie, ale w mapie masz możliwość łatwego mergowania wartości z mapy, zobacz co sie stanie jak wywołasz:

        Map<LocalDate, Duration> map = new HashMap<>();
        map.merge(LocalDate.now(), Duration.ofMinutes(10), Duration::plus);
        map.merge(LocalDate.now(), Duration.ofHours(1), Duration::plus);
        System.out.println(map);

Lektura dla Ciebie


Nie pomagam przez PM. Pytania zadaje się na forum.
edytowany 2x, ostatnio: scibi92, 2020-04-08 23:02

Pozostało 580 znaków

2020-04-09 17:49

Rejestracja: 2 lata temu

Ostatnio: 2 tygodnie temu

0

Fajne rozwiązanie. Nie tworzy duplikatów daty. Widzę tutaj, że jednostki czasu w postaci godzin i minut są łączone za pomocą referencji do metody. W każdym razie spróbuję wdrożyć Twój pomysł i zobaczę co z tego wyjdzie :-)

edytowany 1x, ostatnio: luki25591, 2020-04-09 18:38

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0