Informatică, întrebare adresată de claudianastasiu, 8 ani în urmă

Buna, am nevoie de o clasa cu un eveniment recurent in java dupa cum urmeaza:
Cerință
În această problemă va trebui să definești o clasă EvenimentRecurent. Ea trebuie să fie subclasă a clasei Eveniment(clasa Eveniment este creata deja) și să conțină, în plus, următoarea metodă:

urmatorulEveniment(String) - această metodă primește un String care respectă formatul yyyy-MM-dd HH:mm:ss și returnează un String în același format care reprezintă următorul moment de timp când evenimentul va începe. Acel moment poate fi exact la momentul de timp primit ca parametru sau imediat după.

În plus, clasa va trebui să implementeze următorul constructor:

EvenimentRecurent(String dataInceput, String dataSfarsit, String nume, int numarOre)
unde numarOre reprezintă numărul de ore după care evenimentul are loc din nou. De exemplu, dacă număr ore este 24, înseamnă că evenimentul are loc o dată pe zi.

Restricții și precizări
Diferența de timp dintre data primită de urmatorulEveniment și rezultatul metodei nu va fi mai mare de 1 000 de zile
Pentru rezolvarea acestei probleme poți folosi orice clasă din java.util și java.text
Evenimentele se pot suprapune intre ele

EXEMPLU:

Exemplu
import java.text.*;
import java.util.*;

class Eveniment {
private Date dataInceput, dataSfarsit;
private String nume;
// Primeste 2 stringuri in format yyyy-MM-dd HH:mm:ss reprezentand data si ora
// de inceput si de final a evenimentului si inca un string care contine numele
// cu care apare evenimentul in calendar
public Eveniment(String dataInceput, String dataSfarsit, String nume) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
this.dataInceput = format.parse(dataInceput);
this.dataSfarsit = format.parse(dataSfarsit);
} catch (Exception e) {
System.out.println("Data nu este in formatul cerut!");
}
this.nume = nume;
}

public Date getDataInceput() {
return dataInceput;
}

public Date getDataSfarsit() {
return dataSfarsit;
}

public String getNume() {
return nume;
}
}

// AICI TREBUIE PUSA CLASA FACUTA ( clasa ce cauta urmatorul eveniment ce urmeaza sa se intample )

public class prog {
public static void main(String[] args) {
EvenimentRecurent er = new EvenimentRecurent("2019-03-09 22:46:00",
"2019-03-09 23:00:00", "Scris probleme", 24);
System.out.println(er.urmatorulEveniment("2019-04-19 22:46:23"));
// 2019-04-20 22:46:00
}
}

Va multumesc si va rog doar raspunsuri testate!

Răspunsuri la întrebare

Răspuns de andrei750238
2

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;

class Eveniment {

   private LocalDateTime dataInceput, dataSfarsit;

   private String nume;

   // Primeste 2 stringuri in format yyyy-MM-dd HH:mm:ss reprezentand data si ora

   // de inceput si de final a evenimentului si inca un string care contine numele

   // cu care apare evenimentul in calendar

   public Eveniment(String dataInceput, String dataSfarsit, String nume) {

       try {

           this.dataInceput = LocalDateTime.parse(dataInceput, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

           this.dataSfarsit = LocalDateTime.parse(dataSfarsit, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

       } catch (Exception e) {

           System.out.println("Data nu este in formatul cerut!");

       }

       this.nume = nume;

   }

   public LocalDateTime getDataInceput() {

       return dataInceput;

   }

   public LocalDateTime getDataSfarsit() {

       return dataSfarsit;

   }

   public String getNume() {

       return nume;

   }

}

// AICI TREBUIE PUSA CLASA FACUTA ( clasa ce cauta urmatorul eveniment ce urmeaza sa se intample )

class  EvenimentRecurent extends Eveniment{

   int numarOre;

   public EvenimentRecurent(String dataInceput, String dataSfarsit, String nume, int numarOre){

       super(dataInceput, dataSfarsit, nume);

       this.numarOre = numarOre;

   }

   public String urmatorulEveniment(String x){

       LocalDateTime evenimentDupa = LocalDateTime.parse(x, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

       LocalDateTime copieStart = getDataInceput();

       LocalDateTime copieFinal = getDataSfarsit();

       while(copieStart.isBefore(evenimentDupa)){

           copieStart = copieStart.plusHours(numarOre);

           copieFinal = copieFinal.plusHours(numarOre);

       }

       String ret = copieStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

       return ret;

   }

}

public class prog {

   public static void main(String[] args) {

       EvenimentRecurent er = new EvenimentRecurent("2019-03-09 22:46:00", "2019-03-09 23:00:00", "Scris probleme", 24);

       System.out.println(er.urmatorulEveniment("2019-04-19 22:46:23"));

// 2019-04-20 22:46:00

   }

}

_________________________

► NOTA:

Clasa java.util.Date este un API vechi, are multe functii depricate (cum si multe alte probleme), nu ar mai trebui folosit si nu ne este foarte util pentru problema noastra.

In schimb, clasa LocalDateTime ne ofera toate uneltele de care avem nevoie pentru a rezolva eficient problema.

Programul functioneaza corect pentru datele introduse, asa cum poti vedea in imaginea atasata.

Anexe:

claudianastasiu: Buna Andrei, din pacate, programul tau merge dar eu nu pot folosi acele unelte, pot doar java.util si java.text.....
Alte întrebări interesante