Kolekcja zegarów i dodawanie minuty.

0

Cześć, mam problem z kolejnym zadaniem, trzeba stworzyć kolekcję zegarów (koniecznie musi zawierać obiekt new Clock()), wydrukować ją, a następnie dodać do wcześniej randomowo wygenerowanego zegara jedną minutę i właśnie z dodaniem tej minuty mam problem, ktoś pomoże?
Bo jeżeli chodzi o wydrukowanie za pomocą pętli for, np:

for (Clock item : clockList) {
     System.out.println(item.addMinuteToClock());
}

To oczywiście wszystko działa, ale niestety, program ma wydrukować pierwszą listę, zmienić ją o tą minutę i wydrukować ponownie. Na razie mam coś takiego:


import java.time.LocalTime;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        List<Clock> clockList = Clock.init();
        print(clockList);
        addMinute(clockList);
        System.out.println();
        //print(clockList);
    }

    private static void print(List<Clock> clockList){
        for (Clock item : clockList) {
            System.out.println(item);
        }
    }

    private static List<Clock> addMinute(List<Clock> clockList) {
        for (int i = 0; i < clockList.size(); i++) {

        }
        return clockList;
    }
}

class Clock {

    private LocalTime time;
    private static final Random random = new Random();
    private static List<Clock> clockList = new LinkedList<>();
    public Clock(int hour, int minute) {
        time = LocalTime.of(hour, minute);
    }

    public LocalTime addMinuteToTime() {
        return time.plusMinutes(1);
    }

    @Override
    public String toString() {
        return "Godzina: " + time;
    }

    public static Clock generateClock() {
        int radomHour = random.nextInt(23);
        int randomMinute = random.nextInt(59);
        return new Clock(radomHour, randomMinute);
    }

    public static List<Clock> init() {
        int radomClocks = random.nextInt(5) + 2;
        for (int i = 0; i < radomClocks; i++) {
            clockList.add(generateClock());
        }
        return clockList;
    }
}

Da się to uratować?

4

To nie powinno być tak?

    public Clock addMinuteToTime() {
        return new Clock(hour, minute + 1);
    }

Albo jak zrobisz alternatywny konstruktor to nawet tak?

    public Clock addMinuteToTime() {
        return new Clock(time.plusMinutes(1));
    }

Poza tym ten init nie dość, że ma dziwną nazwę to nie powinien się znajdować w klasie Clock, bo tworzy listę, a nie pojedyńczy zegar.

0

To nie powinno być tak?

@szatkus: Tak już kombinowałem, niestety nie działało, dla minut 59.

Albo jak zrobisz alternatywny konstruktor to nawet tak?

Niestety konstruktor musi taki zostać (polecenie z góry... ;) )

2

Czas, czas, czas ... każdy programista wie, że wie, co to jest czas.
Czyżby?


W moim skrócie w pigułce: są dwa rodzaje czasu:

  • tak jakby cywilizacja człowiecza nie istniała (rozummy jako coś w rodzaju czasu astronomicznego)
  • czas w konkretnej kulturze
0

Założenia zadania, a może nazwy klas od @Ukulelemelelele , a może jedno i drugie - mi nie leży

Dla mnie Clock, to jest coś, co chodzi. Zadanie dodania minuty by oznaczał coś w rodzaju *"zwróć obiekt Proxy, żywy zegar, które idzie minutę do przodu" *.

Zamrożony czas nazywa się zupełnie inaczej, mi pierwsze strzeliło Snapshot, ale Time też by było dobre.

A ze złośliwych danych testowych bym podał np 2021-03-28 01:59

0

Po co Ci ta metoda w klasie Clock i lista Clockow ? Jak i tak w mainie robisz inna liste clockow. Dla mnie to meiszanie dwoch poziomow abstrakcji. ```
List<Clock> clockList = Clock.init();

W lini 10 mozesz zrobic cos w stylu: clockList.forEach( clock -> clock.addMinuteToTime())  


A zamiast tego private LocalTime time; nie mozesz uzyc np. Instant?  Tam sie nic nie przekreca jak minute dodasz :P
0

@WhiteLightning: Nie mogę tak zrobić w linii 10, metoda main musi wyglądać tak jak wygląda. Na razie udało mi się zabezpieczyć zegar przed błędem w przzypadku dodanai minuty do 59 minuty etc. Wszystko wygląda tak.


import java.time.LocalTime;
import java.util.*;

class Program {
    
    public static void main(String[] args) {
        List<Clock> clockList = Clocks.init();
        print(clockList);
        System.out.println();
        addMinute(clockList);
        System.out.println();
        //print(clockList);

    }

    private static void print(List<Clock> clockList) {
        for (Clock item : clockList) {
            System.out.println(item);
        }
    }

    private static List<Clock> addMinute(List<Clock> clockList) {
        for (int i = 0; i < clockList.size(); i++) {
            
        }
        return clockList;
    }
}

class Clock {

    private LocalTime time;

    public Clock(int hour, int minute) {
        time = LocalTime.of(hour, minute);
    }

    public Clock addMinuteToClock() {
        if (time.getHour() == 23 && time.getMinute() == 59) {
            return new Clock(0, 0);
        }
        if (time.getMinute() == 59) {
            return new Clock(time.getHour() + 1, 0);
        }
        return new Clock(time.getHour(), time.getMinute() + 1);
    }

    @Override
    public String toString() {
        return "Godzina: " + time;
    }
}

class Clocks {

    private static final Random random = new Random();
    private static List<Clock> clocksList;
    private static Clock randomClock() {
        int randomHour = random.nextInt(23);
        int randomMinute = random.nextInt(59);
        return new Clock(randomHour, randomMinute);
    }

    public static List<Clock> init() {
        clocksList = new LinkedList<>();
        int clocksSize  = random.nextInt(5) + 2;
        for (int i = 0; i < clocksSize; i++) {
            clocksList.add(randomClock());
        }
        return clocksList;
    }
}
0

@WhiteLightning: Dostałem taka wskazówkę od mentora:

    clockList --> clocks

    private static void addMinute(List<Clock> clocks {
           for (Clock clock : clocks) {
           clock.addMinutes(1);
     }
}

//Tu już klasa Clock
    public Clock addMinutes(int minutes) {
           time.plusMinutes(minutes);
} 

Dziwna jest ta druga metoda, bo jest to obiekt Clock, a niby ma zwracać LocalTime? Przecież to nie zadziała.

1

@Ukulelemelelele: to ci nie zadziała. Wynika to z faktu, że obiekty LocalTime są niezmienne, tj.

	LocalTime time = LocalTime.of(12, 0);
	System.out.println(time.toString()); // 12:00
	
	time.plusMinutes(1);
	System.out.println(time.toString()); // 12:00

Ale:

	LocalTime time = LocalTime.of(12, 0);
	System.out.println(time.toString()); // 12:00
	
	time = time.plusMinutes(1); // Podmieniamy time na time z czasem zwiększonym o jedną minutę
	System.out.println(time.toString()); // 12:01
0

@wartek01: @WhiteLightning: @szatkus: Zrobiłem trochę inaczej niż mentor wskazywał, ale działa...

package com;

import java.time.LocalTime;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        List<Clock> clockList = Clocks.init();
        print(clockList);
        addMinute(clockList ,1);
        System.out.println();
        print(clockList);
    }

    private static void print(List<Clock> clockList) {
        for (Clock item : clockList) {
            System.out.println(item);
        }
    }

    private static List<Clock> addMinute(List<Clock> clocks, int minute) {
        for (Clock item : clocks) {
            item.addMinutes(minute);
        }
        return clocks;
    }
}

class Clock {

    private LocalTime time;
    private int hour;
    private int minute;

    public Clock(LocalTime time) {
        this.time = time;
    }

    public Clock addMinutes(int minute) {
        time = time.plusMinutes(minute);
        return new Clock(time);
    }

    @Override
    public String toString() {
        return "Godzina: " + time;
    }
}

class Clocks {

    private static final Random random = new Random();
    private static List<Clock> clocksList;
    private static Clock randomClock() {
        int randomHour = random.nextInt(23);
        int randomMinute = random.nextInt(59);
        return new Clock(LocalTime.of(randomHour, randomMinute));
    }

    public static List<Clock> init() {
        clocksList = new LinkedList<>();
        int clocksSize  = random.nextInt(5) + 2;
        for (int i = 0; i < clocksSize; i++) {
            clocksList.add(randomClock());
        }
        return clocksList;
    }
}

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