Creare una classe Telefonata con i seguenti attributi
- numero
- ora e data evento
- durata
Prevedere costruttori, costruttore di copia e metodi di accesso e il seguente metodo
- stampaDettagli
creare una classe SIM
- numero
- credito
- tipo (privato o aziendale)
- compagnia telefonica
- elenco 10 chiamate fatte
- elenco 10 chiamate ricevute
Oltre ai metodi metodi di accesso e costruttori, costruttori di copia, prevedere i seguenti metodi accessori:
- aggiungiChiamataFatta
- aggiungiChiamataRicevuta
- trovaChiamataFatta per numero di telefono
- trovaChiamataRicevuta per numero di telefono
- cancellaChimateFatte per numero di telefono
- cancellaChiamateRicevute per numero di telefono
- svuotaElenchi
- durataTotaleChiamate
- stampaElencoChiamate (se in ordine di data/ora meglio)
- numeroMaxChiamateRicevute (numero di telefono con più chiamate ricevute)
Classe Telefonata
La classe in esame non presenta particolari criticità se non per l’uso di LocalDateTime e LocalTime. La loro inizializzazione la lasciamo al main che come al solito sarà la nostra scatola nera per testare tutto l’impianto del codice. Nel metodo di stampa, come al solito, utilizziamo la funzione String.format(“%-21s”, campo) che permette di inserire una stringa adattandola con spazi vuoti di riempimento, per fare una grafica più carina. Nello stesso metodo stampiamo in modo “splittato”, ovvero diviso data e orario della telefonata per una lettura più semplice ed intuitiva.
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Telefonata
{
// ATTRIBUTI
private String numeroChiamante;
private LocalDateTime ricevuta;
private LocalTime durata;
// COSTRUTTORI
//Costruttore vuoto
public Telefonata() {}
public Telefonata(String numeroChiamante, LocalDateTime ricevuta, LocalTime durata)
{
this.numeroChiamante = numeroChiamante;
this.ricevuta = ricevuta;
this.durata = durata;
}
//Costruttore di copia
public Telefonata(Telefonata _t)
{
this.numeroChiamante =_t.getNumeroChiamante();
this.ricevuta = _t.getRicevuta();
this.durata = _t.getDurata();
}
// METODI DI ACCESSO
public String getNumeroChiamante() {
return numeroChiamante;
}
public void setNumeroChiamante(String numeroChiamante) {
this.numeroChiamante = numeroChiamante;
}
public LocalDateTime getRicevuta() {
return ricevuta;
}
public void setRicevuta(LocalDateTime ricevuta) {
this.ricevuta = ricevuta;
}
public LocalTime getDurata() {
return durata;
}
public void setDurata(LocalTime durata) {
this.durata = durata;
}
//METODI ACCESSORI
public void stampaDettagli()
{
System.out.println("|-----------------------------------|");
System.out.println("| TELEFONATA |");
System.out.println("|-----------------------------------|");
System.out.println("| Numero : " + String.format("%-21s", this.numeroChiamante) + "|");
System.out.println("| Ricevuta il: " + String.format("%-21s", this.ricevuta.toLocalDate()) + "|");
System.out.println("| Alle ore : " + String.format("%-21s", this.ricevuta.toLocalTime()) + "|");
System.out.println("| Durata : " + String.format("%-21s", this.durata) + "|");
System.out.println("|-----------------------------------|");
}
}
Classe SIM
La classe sim di questo esercizio è molto interessante. Tra gli attributi non abbiamo i soliti tipi base con magari qualche String. In questo caso ci sono due vettori dinamici ArrayList per catalogare un certo quantitativo di telefonate e un enum per selezionare tra valori predefiniti.
Da notare come nei costruttori, gli arraylist vengano inizializzati col new alla stregua quindi di una classe, operazione replicata in entrambi i costruttori con l’aggiunta della dicitura this() che copia quello che avviene nel costruttore vuoto.
L’inserimento e la ricerca sfruttano i metodi add(), remove() e get() presenti di default nell’ArrayList per manipolare gli oggetti telefonata al loro interno. Non abbiamo previsto l’uso del set(). Mentre la gestione delle durate delle chiamate ci consente di vedere una manipolazione in più che trasforma i secondi in corrispondenti giorni, ore, minuti, secondi.
import java.time.*;
import java.time.temporal.TemporalUnit;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
enum Tipologia {PRIVATO, AZIENDALE}
public class SIM
{
// ATTRIBUTI
private String numero;
private String compagnia;
private double credito;
private Tipologia tipoContratto;
private ArrayList<Telefonata> telefonateRicevute;
private ArrayList<Telefonata> telefonateInviate;
// COSTRUTTORI
public SIM()
{
telefonateRicevute = new ArrayList<Telefonata>();
telefonateInviate = new ArrayList<Telefonata>();
}
public SIM(String numero, String compagnia, double credito, Tipologia tipoContratto) {
this();
this.numero = numero;
this.compagnia = compagnia;
this.credito = credito;
this.tipoContratto = tipoContratto;
}
// METODI DI ACCESSO
public String getNumero() {
return numero;
}
public void setNumero(String numero) {
this.numero = numero;
}
public String getCompagnia() {
return compagnia;
}
public void setCompagnia(String compagnia) {
this.compagnia = compagnia;
}
public double getCredito() {
return credito;
}
public void setCredito(double credito) {
this.credito = credito;
}
public Tipologia getTipoContratto() {
return tipoContratto;
}
public void setTipoContratto(Tipologia tipoContratto) {
this.tipoContratto = tipoContratto;
}
public ArrayList<Telefonata> getTelefonateRicevute() {
return telefonateRicevute;
}
public void setTelefonateRicevute(ArrayList<Telefonata> telefonateRicevute) {
this.telefonateRicevute = telefonateRicevute;
}
public ArrayList<Telefonata> getTelefonateInviate() {
return telefonateInviate;
}
public void setTelefonateInviate(ArrayList<Telefonata> telefonateInviate) {
this.telefonateInviate = telefonateInviate;
}
//METODI ACCESSORI
public void inserisciTelefonataRicevuta(Telefonata _t)
{
this.telefonateRicevute.add(_t);
}
public void inserisciTelefonataInviata(Telefonata _t)
{
this.telefonateInviate.add(_t);
}
//cerca un numero di telefono tra le chiamate e restituisce l'indice della posizione
//se non trova nulla non posso tornare un indice ovviamente e torno un valore -1
public int cercaTelefonataRicevuta(Telefonata _t)
{
for(int i = 0; i < telefonateRicevute.size(); i++ )
{
if (this.telefonateRicevute.get(i).getNumeroChiamante() == _t.getNumeroChiamante())
return i;
}
return -1;
}
//cerca un numero di telefono tra le chiamate e restituisce l'indice della posizione
//se non trova nulla non posso tornare un indice ovviamente e torno un valore -1
public int cercaTelefonataInviata(Telefonata _t)
{
for(int i= 0; i < telefonateInviate.size(); i++ )
{
if (this.telefonateInviate.get(i).getNumeroChiamante() == _t.getNumeroChiamante())
return i;
}
return -1;
}
//cerca un numero di telefono tra le chiamate e restituisce l'indice della posizione
//se non trova nulla non posso tornare un indice ovviamente e torno un valore -1
public int cercaTelefonataRicevuta(String _t)
{
for(int i = 0; i < telefonateRicevute.size(); i++ )
{
if (this.telefonateRicevute.get(i).getNumeroChiamante() == _t)
return i;
}
return -1;
}
//cerca un numero di telefono tra le chiamate e restituisce l'indice della posizione
//se non trova nulla non posso tornare un indice ovviamente e torno un valore -1
public int cercaTelefonataInviata(String _t)
{
for(int i= 0; i < telefonateInviate.size(); i++ )
{
if (this.telefonateInviate.get(i).getNumeroChiamante() == _t)
return i;
}
return -1;
}
//cerca un numero di telefono tra le chiamate e restituisce l'indice della posizione
public void cancellaelefonataRicevuta(Telefonata _t)
{
for(int i = 0; i < telefonateRicevute.size(); i++ )
{
if (this.telefonateRicevute.get(i).getNumeroChiamante() == _t.getNumeroChiamante())
{
this.telefonateRicevute.remove(i);
}
}
}
//cerca un numero di telefono tra le chiamate e lo elimina con l'indice della posizione
public void cancellaTelefonataInviata(Telefonata _t)
{
for(int i= 0; i < telefonateInviate.size(); i++ )
{
if (this.telefonateInviate.get(i).getNumeroChiamante() == _t.getNumeroChiamante())
{
this.telefonateRicevute.remove(i);
}
}
}
//cerca un numero di telefono tra le chiamate e restituisce l'indice della posizione
public void cancellaelefonataRicevuta(String _t)
{
for(int i = 0; i < telefonateRicevute.size(); i++ )
{
if (this.telefonateRicevute.get(i).getNumeroChiamante() == _t)
{
this.telefonateRicevute.remove(i);
}
}
}
//cerca un numero di telefono tra le chiamate e lo elimina con l'indice della posizione
public void cancellaTelefonataInviata(String _t)
{
for(int i= 0; i < telefonateInviate.size(); i++ )
{
if (this.telefonateInviate.get(i).getNumeroChiamante() == _t)
{
this.telefonateRicevute.remove(i);
}
}
}
public void svuotaElenchi()
{
for(int i= 0; i < this.telefonateInviate.size(); i++ )
{
this.telefonateInviate.remove(i);
}
for(int i = 0; i < this.telefonateRicevute.size(); i++ )
{
this.telefonateRicevute.remove(i);
}
}
public void totaleChiamate()
{
long durataTot = 0;
long durataTotTelefonateInviate = 0;
long durataTotTelefonateRicevute= 0;
for(int i= 0; i < this.telefonateInviate.size(); i++ )
{
durataTotTelefonateInviate += this.telefonateInviate.get(i).getDurata().toSecondOfDay();
}
for(int i = 0; i < this.telefonateRicevute.size(); i++ )
{
durataTotTelefonateRicevute += this.telefonateRicevute.get(i).getDurata().toSecondOfDay();
}
durataTot = durataTotTelefonateInviate + durataTotTelefonateRicevute;
long giorni = TimeUnit.SECONDS.toDays(durataTot);
long ore = TimeUnit.SECONDS.toHours(durataTot) - TimeUnit.DAYS.toHours(giorni);
long minuti = TimeUnit.SECONDS.toMinutes(durataTot) - TimeUnit.HOURS.toMinutes(ore) - TimeUnit.DAYS.toMinutes(giorni);
long secondi= durataTot - TimeUnit.MINUTES.toSeconds(minuti) -TimeUnit.HOURS.toSeconds(ore) - TimeUnit.DAYS.toSeconds(giorni);
System.out.println("Durata totale delle chiamate: " + giorni + "g " + ore + "h " + minuti + "m " + secondi + "s");
//analogamente si possono stampare per durataTotTelefonateInviate e durataTotTelefonateRicevute
}
public void stampaChiamate()
{
for(int i= 0; i < this.telefonateInviate.size(); i++ )
{
this.telefonateInviate.get(i).stampaDettagli();
}
for(int i= 0; i < this.telefonateRicevute.size(); i++ )
{
this.telefonateRicevute.get(i).stampaDettagli();
}
}
}
Il main
Come al solito, la nostra blackbox da posizionare nel main per testare quanti più dettagli
public class Main
{
public static void main(String[] args)
{
Telefonata t = new Telefonata("0861410242",
LocalDateTime.of(2022,11,12,23,00),
LocalTime.of(2,15,24));
t.stampaDettagli();
//Creo una sim e ci carico 3 telefonate
SIM s = new SIM("3493827841", "Iliad", 23.00, Tipologia.PRIVATO);
//posso inserire una telefonata creando un oggetto telefonata
s.inserisciTelefonataInviata(t);
s.inserisciTelefonataInviata(new Telefonata("0861234567",
LocalDateTime.of(2022,11,1,11,23),
LocalTime.of(0,32,44)));
s.inserisciTelefonataInviata(new Telefonata("085455667",
LocalDateTime.of(2022,10,21,9,36),
LocalTime.of(1,10,43)));
//oppure inserendo una chiamata new direttamente nel parametro
s.inserisciTelefonataRicevuta(new Telefonata("0861123456",
LocalDateTime.of(2022,11,13,10,20),
LocalTime.of(0,12,24)));
s.totaleChiamate();
s.stampaChiamate();
}
}
Listati completi
Li trovate qui su github
Ultima modifica 17 Novembre 2022