Łączenie elementów z listy

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.");
    }
    }
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<>();
0

Dlaczego nie możesz użyć na starcie LocalDateTime? https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

Będziesz miał minuty dopasowane do daty.

0

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

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ć.

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!");
            }

        }
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;
    }
}

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;
   }
}
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 :)

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

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 :-)

0

Proszę kogoś doświadczonego o sprawdzenie programu i podpowiedz co należałoby w nim zmienić, usprawnić. Trochę zmieniłem koncepcję. Mianowicie usunąłem scannera.
https://github.com/luki25591/AccountOfHours.git

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