Testo

Scrivere una classe Telefono per rappresentare oggetti con attributi costo, modello e annoUscita. Fra gli attributi prevedete anche un ID numerico autoincrementante che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi (escluso ID che è automatico) e opportune implementazioni dei metodi equals, hashCode e compareTo. Il metodo compareTo si baserà sul costo dell’oggetto (un oggetto più costoso è “maggiore” di un oggetto meno costoso), i metodi equals ed hashCode sui valori degli attributi (esclusi ID e costo). Scrivete infine una classe che contiene al suo interno una Map e metodi per inserire una coppia con ID come chiave e l’oggetto come valore, rimuovere un oggetto in base all’ID, stampare l’elenco degli articoli ordinati per prezzo crescente.

Svolgimento

Nella prima parte viene richiesta una classe chiamata Telefono con attributi costo,  modello e annoUscita.

public class Telefono{
    private double costo;
    private String modello;
    private int annoUscita;

}

Creiamo un file chiamato “Telefono.java” e scriviamo al suo interno una semplice classe chiamata Telefono con 3 attributi privati, il primo di tipo double (costo), il secondo di tipo String (modello) e l’ultimo (annoUscita) di tipo int.


Subito dopo viene richiesto fra gli attributi un ID numerico autoincrementante che viene assegnato all’oggetto in fase di creazione e non è più modificabile.

public class Telefono{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private int annoUscita;

}

Inseriamo quindi un attributo intero chiamato appunto ID, lo definiamo sempre privato ma questa volta aggiungiamo, prima del tipo di attributo (int), la parola chiave final che serve a rendere l’attributo non più modificabile. Poi dichiariamo anche un attributo sempre privato e intero, che in questo caso ho chiamato count, e aggiungiamo la parola chiave static che serve a rendere tale attributo condiviso fra tutte le istanze della classe stessa. Infine attribuiamo a count il valore da cui desideriamo far partire i nostri ID. La richiesta verrà conclusa nel costruttore al passo successivo.


Successivamente viene richiesto un costruttore parametrizzato, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class Telefono{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private int annoUscita;

    public Telefono(double costo, String modello, int annoUscita){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setAnnoUscita(annoUscita);
    }

}

Inseriamo un costruttore che ha in ingresso tre degli attributi definiti precedentemente (double costo, String modello, int annoUscita) e al suo interno attribuiamo con il riferimento this all’ID della classe l’attributo count con subito a fianco due +; questo farà si che, una volta invocato il costruttore, prima venga assegnato l’ID e successivamente incrementato l’attributo count, pronto per essere assegnato all’ID del prossimo oggetto che verrà creato. Passiamo infine i tre valori in ingresso come parametro a tre metodi set che andremo a definire in seguito.


Poi viene richiesto il metodo equals, ovvero il metodo che confronta l’oggetto su cui viene invocato con l’oggetto passato come parametro e restituisce un valore booleano. Viene anche specificato di implementare il metodo sui valori degli attributi modello e annoUscita.

public class Telefono{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private int annoUscita;

    public Telefono(double costo, String modello, int annoUscita){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setAnnoUscita(annoUscita);
    }

    @Override
    public boolean equals(Object o){
        if (o == this)
            return true;
        if (!(o instanceof Telefono))
            return false;
        Telefono tel = (Telefono)o;
        return this.modello.equals(tel.modello) && this.annoUscita == tel.annoUscita;
    }

}

Essendo il metodo equals ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere proprio quel metodo. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente un booleano, che si chiama appunto equals e nel quale mettiamo come parametro in ingresso un oggetto di tipo Object con il nome che preferiamo. All’interno andiamo a stabilire in base a quali parametri decidere se due oggetti della stessa classe sono uguali o meno. Prima di tutto andiamo a verificare se l’oggetto passato come parametro è lo stesso oggetto che invoca il metodo, se così fosse andiamo subito a restituire il valore vero (true). Poi andiamo a controllare se l’oggetto passato come parametro non è un’istanza della classe dell’oggetto che invoca il metodo, ovvero andiamo a verificare se l’oggetto passato come parametro non è di tipo Telefono, e in tal caso restituiamo subito il valore falso (false) visto che sicuramente due oggetti di tipo diverso sono diversi. Infine effettuiamo un cast da Object a Telefono per poter chiamare i metodi propri della classe Telefono ed effettuiamo la verifica sull’attributo modello e annoUscita come richiesto dal testo dell’esercizio. Trattandosi di due stringhe sfruttiamo il metodo equals delle stringhe e, dovendo essere verificate contemporaneamente le due condizioni, inseriamo in mezzo l’operatore and (&&), il tutto direttamente dopo la parola chiave return.


Dopo viene richiesto il metodo hashCode, ovvero il metodo che restituisce un codice hash dell’oggetto ed è pensato per fornire supporto alla gestione delle strutture dati di tipo hash. In generale deve avere le seguenti caratteristiche:

  • se invocato sullo stesso oggetto più di una volta durante un’esecuzione di un’applicazione Java, il metodo hashCode deve restituire lo stesso valore intero;
  • se due oggetti sono uguali secondo il metodo equals, l’invocazione del metodo hashCode su ciascuno dei due oggetti deve produrre lo stesso risultato intero;
  • non è necessario che il metodo hashCode produca risultati distinti quando invocato su oggetti che risultino non uguali secondo il metodo equals.

Viene anche specificato di implementare il metodo sui valori degli attributi modello e annoUscita.

public class Telefono{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private int annoUscita;

    public Telefono(double costo, String modello, int annoUscita){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setAnnoUscita(annoUscita);
    }

    @Override
    public boolean equals(Object o){
        if (o == this)
            return true;
        if (!(o instanceof Telefono))
            return false;
        Telefono tel = (Telefono)o;
        return this.modello.equals(tel.modello) && this.annoUscita == tel.annoUscita;
    }


    @Override
    public int hashCode() {
        int result = 17;
        if (this.modello != null) {
            result = 31 * result + this.modello.hashCode();
        }
        if (this.annoUscita != null) {
            result = 31 * result + this.annoUscita;
        }
        return result;
    }
}

Essendo il metodo hashCode ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere proprio quel metodo. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente un intero, che si chiama appunto hashCode e con nessun parametro in ingresso. All’interno è possibile scegliere le operazioni che si reputano migliori, l’importante è attenersi alle caratteristiche citate prima. In questo caso è stata creata una variabile intera con nome result alla quale è stato attribuito il numero 17, dopo tramite un if si è verificato se l’attributo modello sia non null e, in tal caso, si è attribuito a result il prodotto di 31 per result stesso più il metodo hashCode della classe String, essendo l’attributo modello una stringa appunto. Lo stesso procedimento viene ripetuto per l’altro attributo, essendo anch’esso una stringa. Infine viene restituita la variabile result.


Per terminare la classe, viene richiesto il metodo compareTo. Inoltre per completezza creiamo anche i metodi set e get.

public class Telefono{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private int annoUscita;

    public Telefono(double costo, String modello, int annoUscita){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setAnnoUscita(annoUscita);
    }

    public void setCosto(double costo){
        if(costo < 0){
            throw new IllegalArgumentException();
        }
        this.costo = costo;
    }

    public void setModello(String modello){
        this.modello = modello;
    }

    public void setAnnoUscita(int annoUscita){
        this.annoUscita = annoUscita;
    }

    public double getCosto(){
        return this.costo;
    }

    public String getModello(){
        return this.modello;
    }

    public String geetAnnoUscita(){
        return this.annoUscita;
    }

    public int getID(){
        return this.ID;
    }

        @Override
    public boolean equals(Object o){
        if (o == this)
            return true;
        if (!(o instanceof Telefono))
            return false;
        Telefono tel = (Telefono)o;
        return this.modello.equals(tel.modello) && this.annoUscita == tel.annoUscita;
    }


    @Override
    public int hashCode() {
        int result = 17;
        if (this.modello != null) {
            result = 31 * result + this.modello.hashCode();
        }
        if (this.annoUscita != null) {
            result = 31 * result + this.annoUscita;
        }
        return result;
    }

    @Override
    public int compareTo(Telefono other){
        if(this.costo<other.costo)
            return -1;
        else if(other.costo<this.costo)
            return 1;
        return 0;
    }
}

Dovendo implementare il metodo compareTo come prima cosa inseriamo nella definizione iniziale della classe la dicitura “implements Comparable<Telefono>”, che serve per specificare che la classe Telefono implementa l’interfaccia Comparable che contiene il metodo compareTo e quindi permette di comparare oggetti diversi di tale classe.

Essendo il metodo compareTo proprio dell’interfaccia Comparable, inseriamo @Override per essere sicuri di andare a sovrascrivere proprio quel metodo. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente un intero, che si chiama appunto compareTo e nel quale mettiamo come parametro in ingresso un oggetto di tipo Telefono con il nome che preferiamo. All’interno andiamo a stabilire quando l’oggetto passato come parametro è maggiore, minore o uguale rispetto all’oggetto che chiama il metodo restituendo rispettivamente -1, 1 o 0. L’esercizio richiede di eseguire la comparazione tramite l’attributo costo, quindi inseriamo due if con le condizioni dette prima per verificare i primi due casi e infine un return 0 poichè, se si non rientra nei primi due, allora sicuramente si rientrerà nel terzo. Completiamo la classe con i metodi set per gli attributi costo, modello e annoUscita e con i metodi get per tutti gli attributi tranne, ovviamente, il contatore (count).


Infine a completamento dell’esercizio viene richiesta una classe con una Map  e metodi per inserire una coppia con ID come chiave e l’oggetto come valore, rimuovere un oggetto in base all’ID, stampare l’elenco degli articoli ordinati per prezzo crescente.

import java.util.*;

public class Database{
    private Map<Integer, Telefono> map = new HashMap<Integer, Telefono>();

    public Telefono add(Telefono tv){
        return map.put(tv.getID(), tv);
    }

    public Telefono remove(int ID){
        return map.remove(ID);
    }

    public void print(){
        List<Telefono> televisori = new ArrayList<>(map.values());
        Collections.sort(televisori);

        for(Object tv : televisori){
            System.out.println(tv);
        }
    }

    public static void main(String[] args){
        Database db = new Database();
        db.add(new Telefono(12.9, "Samso", "400x400"));
        db.add(new Telefono(110.9, "Samso", "400x400"));
        db.add(new Telefono(10.9, "Samso", "400x400"));
        db.print();
        db.remove(0);
        db.print();
    }
}

Creiamo un file e diamogli il nome che preferiamo ricordando di inserire l’estensione .java e che questo sarà lo stesso nome della nostra classe; in questo caso il file è stato chiamato “Database.java”.

Dovendo utilizzare una Map, per prima cosa importiamola scrivendo “import java.util.*“. Subito dopo scriviamo la classe chiamata Database e come unico attributo mettiamo la Map richiesta dall’esercizio. Per farlo creiamo un nuovo oggetto Map con Integer e Telefono e lo istanziamo con HashMap. Dopo creiamo il metodo per aggiungere elementi alla Map semplicemente richiamando, appunto, il metodo add e passandogli in ingresso l’oggetto passato come parametro al metodo stesso. Stesso procedimento per il metodo di rimozione elementi ma con remove al posto di add e con l’ID passato al metodo stesso.

Adesso andiamo a definire il metodo che stamperà l’elenco dei televisori presenti nella Map in ordine crescente di prezzo. Creiamo un metodo pubblico di tipo void e con nessun parametro in ingresso e chiamiamolo per esempio print. Al suo interno creiamo una List, in questo caso chiamata televisori, e istanziamola come ArrayList passando al costruttore map.values, ovvero tutti i valori presenti all’interno della Map. Questo procedimento è stato fatto per permetterci di usare il metodo sort di Collections che opera sulle List. Quindi subito dopo invochiamo tale metodo con la List creata prima come parametro in ingresso e grazie al metodo compareTo implementato al passo precedente, adesso la List sarà ordinata per come desideriamo noi. Quindi usiamo un ciclo for migliorato per stampare tutti gli elementi della List.
Infine creiamo un breve metodo main per testare le funzioni appena implementate e di conseguenza anche quelle implementate nella classe Telefono.


L’intero codice sorgente dell’esercizio si trova su Github qui!

Sei in possesso di altri compiti d’esame o esercizi e vuoi che li svolga? Contattami e inserisci il link per il download qui!
Per qualsiasi dubbio non esitare a lasciare un commento!

Testo

Scrivere una gerarchia di classi Elettrodomestico->MacchlnaCaffe. Prevedete per la classe Elettrodomestico gli attributi ID (numerico), descrizione, e costo, un costruttore parametrizzato, il metodo toString e metodi set e get per il costo. La classe MacchinaCaffe avrà in aggiunta gli attributi modello e tipologia (cialde, capsule, polvere) e definirà un suo costruttore parametrizzato e il metodo toString. Utilizzate le vostre classi in un programma di esempio che crea una List In cui memorizza alcuni oggetti Elettrodomestico e alcuni oggetti MacchinaCaffe e che verrà infine stampata a schermo.

Svolgimento

In questo esercizio ci vengono richieste due classi chiamate Elettrodomestico e MacchinaCaffe, dove la seconda è un’estensione della prima.

Per quanto riguarda la classe Elettrodomestico vengono richiesti ID, descrizione e costo come attributi.

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;
}

Creiamo un file chiamato “Elettrodomestico.java” e scriviamo al suo interno una semplice classe chiamata Elettrodomestico con 3 attributi privati, uno di tipo Intero (ID), uno di tipo Stringa (descrizione) e il terzo (costo) di tipo Double.


Successivamente viene richiesto un costruttore parametrizzato, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;

    public Elettrodomestico(int ID, String descrizione, double costo){
        this.ID = ID;
        this.descrizione = descrizione;
        setCosto(costo);
    }
}

Inseriamo un costruttore che ha in ingresso i tre attributi definiti precedentemente (int ID, String descrizione, double costo) e al suo interno attribuiamo con il riferimento this all’ID della classe l’ID passato come parametro, stessa cosa per quanto riguarda la descrizione e per il costo mettiamo il metodo set passando la variabile costo usata come parametro del costruttore. Anche se ancora non abbiamo definito e implementato il metodo set, lo inseriamo fin da subito e lo definiremo in un secondo momento.


Poi viene richiesto il metodo toString, ovvero il metodo che viene richiamato in automatico quando stampiamo un oggetto della classe e che ci mostra le informazioni di essa.

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;

    public Elettrodomestico(int ID, String descrizione, double costo){
        this.ID = ID;
        this.descrizione = descrizione;
        setCosto(costo);
    }

    @Override
    public String toString(){
        return "ID: " + this.ID + " Descrizione: " + this.descrizione + " Costo: " + this.costo;
    }
}

Essendo il metodo toString ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere il metodo toString. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente una stringa, che si chiama appunto toString e con nessun parametro in ingresso. All’interno inseriamo un semplice return con la stringa che desideriamo restituire, solitamente si mettono i parametri importanti della classe accompagnati da una piccola descrizione.


Per terminare la classe Elettrodomestico vengono richiesti i metodi set e get per l’attributo costo

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;

    public Elettrodomestico(int ID, String descrizione, double costo){
        this.ID = ID;
        this.descrizione = descrizione;
        setCosto(costo);
    }

    public void setCosto(double costo){
        if(costo > 0){
            this.costo = costo;
        }
    }

    public double getCosto(){
        return this.costo;
    }

    @Override
    public String toString(){
        return "ID: " + this.ID + " Descrizione: " + this.descrizione + " Costo: " + this.costo;
    }
}

Quindi creiamo un metodo pubblico void per quanto riguarda setCosto e al suo interno inseriamo un if dove come condizione mettiamo che se il parametro in ingresso al metodo set è positivo (> 0), allora lo andiamo ad attribuire alla variabile della classe. Per concludere definiamo il metodo getCosto che in questo caso non fa altro che restituire il valore dell’attributo corrispondente tramite il comando return.


Per quanto riguarda la classe MacchinaCaffe, che estenderà Elettrodomestico e quindi erediterà i suoi attributi e metodi, vengono richiesti come attributi aggiuntivi modello e tipologia.

public class MachinaCaffe extends Elettrodomestico{
    private String modello;
    private String tipologia;

}

Anche per questa classe creiamo un file chiamato “MacchinaCaffe.java” e scriviamo al suo interno una classe chiamata MacchinaCaffe che in questo caso estende, tramite la parola chiave extends, la classe creata precedentemente (Elettrodomestico). Inseriamo i suoi due nuovi attributi privati, entrambi di tipo Stringa modello e tipologia.


Successivamente viene richiesto un costruttore parametrizzato, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class MacchinaCaffe extends Elettrodomestico{
    private String modello;
    private String tipologia;

    public MacchinaCaffe(int ID, String descrizione, double costo, String modello, String tipologia){
        super(ID, descrizione, costo);
        setModello(modello);
        setTipologia(tipologia);
    }

}

Inseriamo un costruttore che ha in ingresso sia i due attributi definiti precedentemente che gli attributi della classe Elettrodomestico, sua classe genitore (int ID, String descrizione, double costo, String modello, String tipologia).

All’interno del costruttore la primissima cosa da fare è richiamare il costruttore della classe Elettrodomestico tramite l’operatore super, al quale passiamo i tre parametri che abbiamo definito all’interno della classe Elettrodomestico. Grazie all’operatore super verrà usato il costruttore della classe genitore (Elettrodomestico) per gestire i tre attributi ID, descrizione e costo per come è stato stabilito nel costruttore implementato nella classe genitore.

Subito dopo inseriamo i due metodi set relativi ai due attributi passando i parametri modello e tipologia. Anche se ancora non abbiamo definito e implementato questi due metodi set, li inseriamo fin da subito e li definiremo in un secondo momento.


Per concludere ci viene richiesto il il metodo toString, ovvero il metodo che viene richiamato in automatico quando stampiamo un oggetto della classe e che ci mostra le informazioni di essa. A completamento della classe, anche se non richiesto, inseriamo anche i metodi set e get per gli attributi modello e tipologia.

public class MacchinaCaffe extends Elettrodomestico{
    private String modello;
    private String tipologia;
    private final String[] tipologie = {"cialde", "capsule", "polvere"};

    public MacchinaCaffe(int ID, String descrizione, double costo, String modello, String tipologia){
        super(ID, descrizione, costo);
        setModello(modello);
        setTipologia(tipologia);
    }

    public void setModello(String modello){
        this.modello = modello;
    }

    public void setTipologia(String tipologia){
        for(int i = 0; i < tipologie.length; i++){
            if(tipologia.equals(tipologie[i])){
                this.tipologia = tipologia;
                return;
            }
        }
        throw new IllegalArgumentException();
    }

    public String getModello(){
        return this.modello;
    }

    public double getTipologia(){
        return this.tipologia;
    }

    @Override
    public String toString(){
        return super.toString() + " Modello: " + this.modello + " Tipologia: " + this.tipologia;
    }
}

Essendo il metodo toString ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere il metodo toString. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente una stringa, che si chiama appunto toString e con nessun parametro in ingresso. All’interno inseriamo un semplice return con la stringa che desideriamo restituire, solitamente si mettono i parametri importanti della classe accompagnati da una piccola descrizione.

Nei metodi set attribuiamo semplicemente il parametro in ingresso all’attributo corrispondente della classe tramite il riferimento this, tranne per seTipologia, dove creiamo un array con le tipologia ammesse (cialde, capsule e polvere) e verifichiamo se il valore passato come parametro rientra in una di queste sennò lanciamo un’eccezione.Nei metodi get restituiamo il parametro della classe corrispondente.


Per concludere l’esercizio viene richiesta una classe per testare le due create precedentemente creando una List in cui vengono memorizzati alcuni oggetti Elettrodomestico e alcuni oggetti MacchinaCaffe e che verrà infine stampata a schermo.

import java.util.Scanner;
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        List<Elettrodomestico> elettrodomestici = new ArrayList<>();

        for(int i = 0; i < 5; i++){
            System.out.print("ID: ");
            int ID = sc.nextInt();
            System.out.print("Descrizione: ");
            String descrizione = sc.next();
            System.out.print("Costo: ");
            double costo = sc.nextDouble();
            System.out.print("Modello:");
            String modello = sc.next();
            System.out.print("Tipologia:");
            String tipologia = sc.next();
            elettrodomestici.add(new MacchinaCaffe(ID, descrizione, costo, modello, tipologia));
        }

        for(int i = 0; i < 5; i++){
            System.out.print("ID: ");
            int ID = sc.nextInt();
            System.out.print("Descrizione: ");
            String descrizione = sc.next();
            System.out.print("Costo: ");
            double costo = sc.nextDouble();
            elettrodomestici.add(new Elettrodomestico(ID, descrizione, costo));
        }

        Iterator<Elettrodomestico> iter = elettrodomestici.iterator();

        while(iter.hasNext()){
            System.out.println(iter.next());
        }
    }
}

Per realizzare questa classe, che chiameremo Main, faremo scegliere all’utente i parametri degli oggetti Elettrodomestico e MacchinaCaffe. Prima di tutto importiamo “import java.util.Scanner” per poter utilizare lo Scanner e “import java.util.*” per usare la classe ArrayList e l’interfaccia List. Successivamente creiamo la classe pubblica Main e al suo interno creiamo subito il classico metodo main pubblico, statico e void con in ingresso la dicitura “String[] args”. Dentro questo metodo creiamo un nuovo oggetto Scanner chiamato sc e un nuovo oggetto List di Elettrodomestico e lo istanziamo come ArrayList. Abbiamo creato la List di tipo Elettrodomestico per poter immagazzinare al suo interno entrambi i tipi di oggetto (essendo MacchinaCaffe un’estensione di Elettrodomestico). Dopo inseriamo un ciclo for che va da 0 al numero di oggetti MacchinaCaffe che desideriamo inserire nella List e al suo interno richiamiamo un Println per specificare cosa si sta inserendo e uno Scanner (questo procedimento va ripetuto per ogni attributo della classe); infine aggiungiamo il nuovo oggetto alla List. Lo stesso procedimento va effettuato per gli oggetti di tipo Elettrodomestico. Infine per stampare il contenuto della List creiamo un Iterator e gli attribuiamo l’Iterator della List, dentro un ciclo While inseriamo un Println di iter.next e come condizione iter.hasNext, il primo serve per richiamare l’elemento successivo della List mentre il secondo per verificare se vi sono altri elementi.


L’intero codice sorgente dell’esercizio si trova su Github qui!

Sei in possesso di altri compiti d’esame o esercizi e vuoi che li svolga? Contattami e inserisci il link per il download qui!
Per qualsiasi dubbio non esitare a lasciare un commento!

Prova 2

  1. Scrivere una classe Lavatrice per descrivere gli articoli di un negozio che avranno per attributi marca, modello,  capacità e disponibilità funzioni smart (boolean). Prevedete un costruttore parametrizzato per inizializzare l’oggetto e un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default. Prevedete anche dei metodi interattivi per modificare i singoli attributi, un metodo toString e metodi set e get. Gestite eventuali eccezioni direttamente all’interno dei metodi in cui si presentano.
  2. Scrivere un’interfaccia Pulizia col solo metodo void pulisci() e le classi Forno e MacchinaCaffe che la implementano. Prevedete per la classe Forno gli attributi ID (numerico), modello e temperatura, un costruttore senza parametri, un metodo set per modificare tutti gli attributi, e i metodi get che ritenete necessari. La classe MacchinaCaffe avrà gli attributi ID (numerico), modello e tipologia (cialde o capsule), un costruttore senza parametri, un metodo set per modifcare tutti gli attributi, e i metodi get che ritenete necessari. Il metodo pulisci() chiederà la temperatura di pulizia per forni e il numero di erogazioni a vuoto da effettuare per le macchine da caffè. Utilizzare le vostre classi in un programma di esempio che crea una Map in cui memorizza alcuni oggetti che implementano Pulizia, indicizzandoli in base all’ID, e che avvia la pulizia di tutti gli elementi. Se lo ritenete opportuno utilizzate altre classi oltre quelle richieste dal testo.
  3. Scrivere una classe Televisore per rappresentare oggetti con attributi costo, marca, modello e dimensione. Fra gli attributi prevedete anche un ID numeri che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi e opportune implementazioni dei metodi equals e hashCode che si basano sui soli valori degli attributi marca e modello (due televisori saranno uguali se hanno uguali marca e modello, indipendentemente da ID, costo e dimensione). Scrivete infine una classe che contiene al suo interno due List, due metodi per inserire un televisore in ciascuna delle due liste e un metodo per trovare il televisore in assoluto con la dimensione minore.

Prova 3

  1. Scrivere una classe MacchinaCaffe per descrivere gli articoli di un negozio che avranno per attributi marca, modello, tipologia (cialde o capsule) e colore. Prevedete un costruttore parametrizzato per inizializzare l’oggetto e un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default. Prevedete anche dei metodi interattivi per modificare i singoli attributi, un metodo toString e metodi set e get. Gestire eventuali eccezioni direttamente all’interno dei metodi in cui si presentano.
  2. Scrivere un’interfaccia Riproduzione col solo metodo int riproduci() e le classi SerieTV e Film che la implementano. Prevedete per la classe SerieTV gli attributi ID (numerico), titolo e numeri di stagioni, un costruttore senza parametri, un metodo set per modificare tutti gli attributi, e i metodi get che ritenete necessari. La classe Film avrà gli attributi ID (numerico), titolo e durata, un costruttore senza parametri, un metodo set per modificare tutti gli attributi, e i metodi get che ritenete necessari. Il metodo riproduci() ritorna la durata dei film o della serie (in questo caso si assume 400 per il numero di stagioni). Utilizzate le vostre classi in un programma di esempio che crea una Map in cui memorizza alcuni oggetti che implementano Riproduzione, indicizzandoli in base all’ID, e che infine stampa la durata complessiva di tutti gli elementi. Se lo ritenete opportuno utilizzate altre classi oltre quelle richieste dal testo.
  3. Scrivere una classe Libro per rappresentare oggetti con attributi titolo, autore e prezzo. Fra gli attributi prevedete anche un ID numerico che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi e opportune implementazioni dei metodi equals e hashCode che si bassano sui solo valori degli attributi titolo e autore (due libri saranno uguali se hanno uguali titolo e autore, indipendentemente da ID e prezzo). Scrivete infine una classe che contiene al suo interno due List, due metodi per inserire un libro in ciascuna delle due liste e un metodo per trovare il costo complessivo di tutti i libri di un determinato autore il cui nome è passato come parametro al metodo.

Prova 4

  1. Scrivere una classe SerieTV per descrivere gli articoli di un catalogo multimediale che avranno per attributi titolo, produttore, stagioni e anno. Prevedete un costruttore parametrizzato per inizializzare l’oggetto e un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default. Prevedete anche dei metodi interattivi per modificare i singoli attributi, un metodo toString e metodi set e get. Gestite eventuali eccezioni direttamente all’interno dei metodi in cui si presentano.
  2. Scrivere un’interfaccia Spegnimento col solo metodo void spegni() e le classi Televisore e Computer che la implementano. Prevedete per la classe Televisore gli attributi ID (numerico), modello e dimensione, un costruttore senza parametri, un metodo set per modificare tutti gli attributi, e i metodi get che ritenete necessari. La classe Computer avrà gli attributi ID (numerico), modello e tipologia (laptop o desktop), un costruttore senza parametri, un metodo set per modificare tutti gli attributi, e i metodi get che ritenete necessari. Il metodo spegni() chiederà conferma per i computer mentre chiederà dopo quanti minuti spegnere per i televisori. Utilizzate le vostre classi in un programma di esempio che crea una Map in cui memorizza alcuni oggetti che implementano Spegnimento, indicizzandoli in base all’ID, e che awia lo spegnimento di tutti gli elementi. Se lo ritenete opportuno utilizzate altre classi oltre quelle richieste dal testo.
  3. Scrivere una classe Lavatrice per rappresentare oggetti con attributi marca, modello e capacità. Fra gli attributi prevedete anche un ID numerico che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi e opportune implementazioni dei metodi equals e hashCode che si basano sui soli valori degli attributi marca e modello. Scrivete infine una classe che contiene al suo interno due List, due metodi per inserire una lavatrice in ciascuna delle due liste e un metodo per trovare la lavatrice in assoluto con la maggiore capacità di carico.

Prova 5

  1. Scrivere una classe Televisore per descrivere gli articoli di un negozio che avranno per attributi marca, modello, dimensione e tecnologia (OLED, QLED, LED). Prevedete un costruttore parametrizzato per inizializzare l’oggetto e un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default. Prevedete anche dei metodi interattivi per modificare i singoli attributi, un metodo toString e metodi set e get. Gestire eventuali eccezioni direttamente all’interno dei metodi in cui si presentano.
  2. Scrivere un’interfaccia Erogazione col solo metodo int eroga() e le classi MacchinaCaffe e DistributoreSnack che la implementano. Prevedete per la classe MacchinaCaffe gli attributi ID (numerico), percentuale riempimento serbatoio acqua e percentuale riempimento servatoio caffè, un costruttore senza parametri, un metodo set per modificare tutti gli attributi, e i metodi get che ritenete necessari. La classe DistributoreSnack avrà gli attributi ID (numerico), quantità barrette di cioccolato residue, quantità bottiglie acqua residue, un costruttore senza parametri, un metodo set per modificare tutti gli attributi, e i metodi get che ritenete necessari. Il metodo eroga() chiederà cosa erogare (caffè o acqua calda per macchina caffè e barretta o acqua per distributore e restituirà l’incasso in centesimi (20 acqua calda, 60 caffè, 120 barretta, 60 acqua)). Utilizzate le vostre classi in un programma di esempio che crea una Map in cui memorizza alcuni oggetti che implementano Erogazione, indicizzandoli in base all’ID, e che avvia un’erogazione in tutti gli elementi e stampa l’incasso complessivo. Se lo ritenete opportuno utilizzate altre classi oltre quelle richieste dal testo.
  3. Scrivere una classe Telefono per rappresentare oggetti con attributi modello, marca e anno. Fra gli attributi prevedete anche un ID numerico che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi e opportune implementazioni dei metodi equals e hashCode che si bassano sui solo valori degli attributi modello e marca (due telefoni saranno uguali se hanno uguali marca e modello, indipendentemente da ID e anno). Scrivete infine una classe che contiene al suo interno due List, due metodi per inserire un telefono in ciascuna delle due liste e un metodo per trovare duplicati all’interno di ciascuna lista.

Per degli esempi di possibili implementazioni è possibile visionare l’altro appello.

Hai altre prove d’esame e desideri vedere come svolgerle? Mandami il link per il download qui: Contattami

Per qualsiasi dubbio o delucidazione non esitare a lasciare un commento 👍🏻

Testo

Scrivere una classe Televisore per descrivere gli articoli di un catalogo di televisori che avranno per attributi marca, modello e dimensione. Prevedete un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default, un metodo interattivo per settare tutti gli attributi, un metodo toString e metodi set e get. Lanciate un’eccezione quando si prova ad assegnare a un attributo un valore non valido.

Svolgimento

Nella prima parte viene richiesta una classe chiamata Televisore con attributi marca,  modello e dimensione.

public class Televisore{
    private String marca, modello;
    private int dimensione;

}

Creiamo un file chiamato “Televisore.java” e scriviamo al suo interno una semplice classe chiamata Televisore con 3 attributi privati, i primi due di tipo Stringa (marca e modello) e il terzo (dimensione) di tipo intero.


Successivamente viene richiesto un costruttore senza parametri, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class Televisore{
    private String marca, modello;
    private int dimensione;

    public Televisore(){
        setMarca("Default");
        setModello("Default");
        setDimensione(32);
    }
}

Inseriamo un costruttore senza alcun parametro tra le parentesi tonde e al suo interno mettiamo i tre metodi Set per i tre attributi passando dei parametri scelti da noi che saranno quelli di Default. Anche se ancora non abbiamo definito e implementato questi tre metodi set li inseriamo fin da subito e li definiremo in un secondo momento.


Poi viene richiesto un metodo interattivo per settare tutti gli attributi della classe che abbiamo precedentemente creato (marca, modello e dimensione).

import java.util.Scanner;

public class Televisore{
    private String marca, modello;
    private int dimensione;

    public Televisore(){
        setMarca("Default");
        setModello("Default");
        setDimensione(32);
    }

    public void setValues(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Marca: ");
        setMarca(sc.nextLine());
        System.out.println("Modello: ");
        setModello(sc.nextLine());
        System.out.println("Dimensione: ");
        setDimensione(sc.nextInt());
    }

}

Prima di tutto, dovendo interagire con il terminale, importiamo la classe Scanner inserendo all’inizio del file la dicitura “import java.util.Scanner;“. Adesso possiamo creare il metodo void, perchè non dobbiamo restituire nessun valore, e dargli come nome per esempio setValues. Al suo interno creiamo un nuovo oggetto Scanner e per ogni attributo inseriamo un println per dare un minimo di contesto e subito dopo richiamiamo il metodo set corrispondente passandogli il metodo dell’oggetto Scanner corrispondente al tipo dell’attributo che stiamo considerando. Quindi per l’attributo marca, che è di tipo Stringa, al metodo setMarca() passiamo sc.nextLine() dove sc è l’oggetto Scanner mentre nextLine è il metodo per acquisire una riga completa come Stringa.


Successivamente viene richiesto il metodo toString, ovvero il metodo che viene richiamato in automatico quando stampiamo un oggetto della classe e che ci mostra le informazioni di essa.

import java.util.Scanner;

public class Televisore{
    private String marca, modello;
    private int dimensione;

    public Televisore(){
        setMarca("Default");
        setModello("Default");
        setDimensione(32);
    }

    public void setValues(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Marca: ");
        setMarca(sc.nextLine());
        System.out.println("Modello: ");
        setModello(sc.nextLine());
        System.out.println("Dimensione: ");
        setDimensione(sc.nextInt());
    }

    @Override
    public String toString(){
        return "Marca: " + this.marca + " Modello: " + this.modello + "Dimensione: " + this.dimensione;
    }
}

Essendo il metodo toString ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere il metodo toString. Subito sotto andiamo a dichiarare un metodo pubblico che restituisce obbligatoriamente una stringa, che si chiama appunto toString e con nessun parametro in ingresso. All’interno inseriamo un semplice return con la stringa che desideriamo restituire, solitamente si mettono i parametri importanti della classe accompagnati da una piccola descrizione.


Infine, ci vengono richiesti i metodi set e get per i parametri inseriti in precedenza e, qualora si inserisse un parametro non valido, di lanciare un’eccezione.

import java.util.Scanner;

public class Televisore{
    private String marca, modello;
    private int dimensione;
    private final String[] marche = {"LG", "Samsung", "AKAI", "Sony"};
    private final String[] modelli = {"Az12312", "4K", "Pippo"};

    public Televisore(){
        setMarca("Default");
        setModello("Default");
        setDimensione(32);
    }

    public void setMarca(String marca){
        for(int i = 0; i < marche.length; i++){
            if(marca.equals(marche[i])){
                this.marca = marca;
                return;
            }
        }
        throw new IllegalArgumentException();
    }

    public void setModello(String modello){
        for(int i = 0; i < modelli.length; i++){
            if(modello.equals(modelli[i])){
                this.modello = modello;
                return;
            }
        }
        throw new IllegalArgumentException();
    }

    public void setDimensione(int dimensione){
        if(dimensione > 0){
            this.dimensione = dimensione;
        }
        throw new IllegalArgumentException();
    }

    public String getMarca(){
        return this.marca;
    }

    public String getModello(){
        return this.modello;
    }

    public int getDimensione(){
        return this.dimensione;
    }

    public void setValues(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Marca: ");
        setMarca(sc.nextLine());
        System.out.println("Modello: ");
        setModello(sc.nextLine());
        System.out.println("Dimensione: ");
        setDimensione(sc.nextInt());
    }

    @Override
    public String toString(){
        return "Marca: " + this.marca + " Modello: " + this.modello + "Dimensione: " + this.dimensione;
    }
}

Per prima cosa andiamo a definire due array final (statici) dove inseriremo i valori che riteniamo accettabili per marca e modello, nel codice sopra li ho chiamati semplicemente marche e modelli. Adesso passiamo ai metodi set, per quanto riguarda setMarca e setModello bisogna scorrere con un ciclo for l’array che abbiamo creato precedentemente e al suo interno inserire un if dove come condizione mettiamo che se il parametro in ingresso al metodo set è uguale all’elemento dell’array che stiamo considerando, allora lo andiamo ad attribuire alla variabile della classe. Subito dopo mettiamo un return per far terminare l’esecuzione del metodo. Infine se scorrendo tutto l’array la condizione dell’if non è stata verificata, ovvero il valore che stiamo provando ad attribuire non rientra tra quelli scelti da noi, lanciamo un’eccezione tramite il comando throw, nell’esempio sopra ho scelto di lanciare IllegalArgumentException. Per quanto riguarda il metodo setDimensione, essendo un numero intero, il discorso è più semplice: basterà inserire un if dove verifichiamo che il numero sia positivo (> 0). Per concludere definiamo i metodi get che in questo caso non fanno altro che restituire il valore dell’attributo corrispondente tramite il comando return.


L’intero codice sorgente dell’esercizio si trova su Guthub qui!

Sei in possesso di altri compiti d’esame o esercizi e vuoi che li svolga? Contattami e inserisci il link per il download qui!
Per qualsiasi dubbio non esitare a lasciare un commento!

Testo

Scrivere una classe Televisore per rappresentare oggetti con attributi costo, modello e dimensione. Fra gli attributi prevedete anche un ID numerico autoincrementante che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi (escluso ID che è automatico) e opportune implementazioni dei metodi equals, hashCode e compareTo. Il metodo compareTo si baserà sul costo dell’oggetto (un oggetto più costoso è “maggiore” di un oggetto meno costoso), i metodi equals ed hashCode sui valori degli attributi (esclusi ID e costo). Scrivete infine una classe che contiene al suo interno una Map e metodi per inserire una coppia con ID come chiave e l’oggetto come valore, rimuovere un oggetto in base all’ID, stampare l’elenco degli articoli ordinati per prezzo crescente.

Svolgimento

Nella prima parte viene richiesta una classe chiamata Televisore con attributi costo,  modello e dimensione.

public class Televisore{
    private double costo;
    private String modello;
    private String dimensione;

}

Creiamo un file chiamato “Televisore.java” e scriviamo al suo interno una semplice classe chiamata Televisore con 3 attributi privati, il primo di tipo double e gli altri due (modello e dimensione) di tipo stringa.


Subito dopo viene richiesto fra gli attributi un ID numerico autoincrementante che viene assegnato all’oggetto in fase di creazione e non è più modificabile.

public class Televisore{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private String dimensione;

}

Inseriamo quindi un attributo intero chiamato appunto ID, lo definiamo sempre privato ma questa volta aggiungiamo, prima del tipo di attributo (int), la parola chiave final che serve a rendere l’attributo non più modificabile. Poi dichiariamo anche un attributo sempre privato e intero, che in questo caso ho chiamato count, e aggiungiamo la parola chiave static che serve a rendere tale attributo condiviso fra tutte le istanze della classe stessa. Infine attribuiamo a count il valore da cui desideriamo far partire i nostri ID. La richiesta verrà conclusa nel costruttore al passo successivo.


Successivamente viene richiesto un costruttore parametrizzato, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class Televisore{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private String dimensione;

    public Televisore(double costo, String modello, String dimensione){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setDimensione(dimensione);
    }

}

Inseriamo un costruttore che ha in ingresso tre degli attributi definiti precedentemente (double costo, String modello, double dimensione) e al suo interno attribuiamo con il riferimento this all’ID della classe l’attributo count con subito a fianco due +; questo farà si che, una volta invocato il costruttore, prima venga assegnato l’ID e successivamente incrementato l’attributo count, pronto per essere assegnato all’ID del prossimo oggetto che verrà creato. Passiamo infine i tre valori in ingresso come parametro a tre metodi set che andremo a definire in seguito.


Poi viene richiesto il metodo equals, ovvero il metodo che confronta l’oggetto su cui viene invocato con l’oggetto passato come parametro e restituisce un valore booleano. Viene anche specificato di implementare il metodo sui valori degli attributi modello e dimensione.

public class Televisore{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private String dimensione;

    public Televisore(double costo, String modello, String dimensione){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setDimensione(dimensione);
    }

    @Override
    public boolean equals(Object o){
        if (o == this)
            return true;
        if (!(o instanceof Televisore))
            return false;
        Televisore tel = (Televisore)o;
        return this.modello.equals(tel.modello) && this.dimensione.equals(tel.dimensione);
    }

}

Essendo il metodo equals ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere proprio quel metodo. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente un booleano, che si chiama appunto equals e nel quale mettiamo come parametro in ingresso un oggetto di tipo Object con il nome che preferiamo. All’interno andiamo a stabilire in base a quali parametri decidere se due oggetti della stessa classe sono uguali o meno. Prima di tutto andiamo a verificare se l’oggetto passato come parametro è lo stesso oggetto che invoca il metodo, se così fosse andiamo subito a restituire il valore vero (true). Poi andiamo a controllare se l’oggetto passato come parametro non è un’istanza della classe dell’oggetto che invoca il metodo, ovvero andiamo a verificare se l’oggetto passato come parametro non è di tipo Televisore, e in tal caso restituiamo subito il valore falso (false) visto che sicuramente due oggetti di tipo diverso sono diversi. Infine effettuiamo un cast da Object a Televisore per poter chiamare i metodi propri della classe Televisore ed effettuiamo la verifica sull’attributo modello e dimensione come richiesto dal testo dell’esercizio. Trattandosi di due stringhe sfruttiamo il metodo equals delle stringhe e, dovendo essere verificate contemporaneamente le due condizioni, inseriamo in mezzo l’operatore and (&&), il tutto direttamente dopo la parola chiave return.


Dopo viene richiesto il metodo hashCode, ovvero il metodo che restituisce un codice hash dell’oggetto ed è pensato per fornire supporto alla gestione delle strutture dati di tipo hash. In generale deve avere le seguenti caratteristiche:

  • se invocato sullo stesso oggetto più di una volta durante un’esecuzione di un’applicazione Java, il metodo hashCode deve restituire lo stesso valore intero;
  • se due oggetti sono uguali secondo il metodo equals, l’invocazione del metodo hashCode su ciascuno dei due oggetti deve produrre lo stesso risultato intero;
  • non è necessario che il metodo hashCode produca risultati distinti quando invocato su oggetti che risultino non uguali secondo il metodo equals.

Viene anche specificato di implementare il metodo sui valori degli attributi modello e dimensione.

public class Televisore{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private String dimensione;

    public Televisore(double costo, String modello, String dimensione){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setDimensione(dimensione);
    }

    @Override
    public boolean equals(Object o){
        if (o == this)
            return true;
        if (!(o instanceof Televisore))
            return false;
        Televisore tel = (Televisore)o;
        return this.modello.equals(tel.modello) && this.dimensione.equals(tel.dimensione);
    }

    @Override
    public int hashCode() {
        int result = 17;
        if (this.modello != null) {
            result = 31 * result + this.modello.hashCode();
        }
        if (this.dimensione != null) {
            result = 31 * result + this.dimensione.hashCode();
        }
        return result;
    }
}

Essendo il metodo hashCode ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere proprio quel metodo. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente un intero, che si chiama appunto hashCode e con nessun parametro in ingresso. All’interno è possibile scegliere le operazioni che si reputano migliori, l’importante è attenersi alle caratteristiche citate prima. In questo caso è stata creata una variabile intera con nome result alla quale è stato attribuito il numero 17, dopo tramite un if si è verificato se l’attributo modello sia non null e, in tal caso, si è attribuito a result il prodotto di 31 per result stesso più il metodo hashCode della classe String, essendo l’attributo modello una stringa appunto. Lo stesso procedimento viene ripetuto per l’altro attributo, essendo anch’esso una stringa. Infine viene restituita la variabile result.


Per terminare la classe, viene richiesto il metodo compareTo. Inoltre per completezza creiamo anche i metodi set e get.

public class Televisore implements Comparable<Televisore>{
    private static int count = 0;
    private final int ID;
    private double costo;
    private String modello;
    private String dimensione;

    public Televisore(double costo, String modello, String dimensione){
        this.ID = count++;
        setCosto(costo);
        setModello(modello);
        setDimensione(dimensione);
    }

    public void setCosto(double costo){
        if(costo < 0){
            throw new IllegalArgumentException();
        }
        this.costo = costo;
    }

    public void setModello(String modello){
        this.modello = modello;
    }

    public void setDimensione(String dimensione){
        this.dimensione = dimensione;
    }

    public double getCosto(){
        return this.costo;
    }

    public String getModello(){
        return this.modello;
    }

    public String getDimensione(){
        return this.dimensione;
    }

    public int getID(){
        return this.ID;
    }

    @Override
    public String toString(){
        return "ID: " + this.ID + " Costo: " + this.costo + " Modello: " + this.modello + " Dimensione: " + this.dimensione;
    }

    @Override
    public boolean equals(Object o){
        if (o == this)
            return true;
        if (!(o instanceof Televisore))
            return false;
        Televisore tel = (Televisore)o;
        return this.modello.equals(tel.modello) && this.dimensione.equals(tel.dimensione);
    }

    @Override
    public int hashCode() {
        int result = 17;
        if (this.modello != null) {
            result = 31 * result + this.modello.hashCode();
        }
        if (this.dimensione != null) {
            result = 31 * result + this.dimensione.hashCode();
        }
        return result;
    }

    @Override
    public int compareTo(Televisore other){
        if(this.costo<other.costo)
            return -1;
        else if(other.costo<this.costo)
            return 1;
        return 0;
    }
}

Dovendo implementare il metodo compareTo come prima cosa inseriamo nella definizione iniziale della classe la dicitura “implements Comparable<Televisore>”, che serve per specificare che la classe Televisore implementa l’interfaccia Comparable che contiene il metodo compareTo e quindi permette di comparare oggetti diversi di tale classe.

Essendo il metodo compareTo proprio dell’interfaccia Comparable, inseriamo @Override per essere sicuri di andare a sovrascrivere proprio quel metodo. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente un intero, che si chiama appunto compareTo e nel quale mettiamo come parametro in ingresso un oggetto di tipo Televisore con il nome che preferiamo. All’interno andiamo a stabilire quando l’oggetto passato come parametro è maggiore, minore o uguale rispetto all’oggetto che chiama il metodo restituendo rispettivamente -1, 1 o 0. L’esercizio richiede di eseguire la comparazione tramite l’attributo costo, quindi inseriamo due if con le condizioni dette prima per verificare i primi due casi e infine un return 0 poichè, se si non rientra nei primi due, allora sicuramente si rientrerà nel terzo. Completiamo la classe con i metodi set per gli attributi costo, modello e dimensione e con i metodi get per tutti gli attributi tranne, ovviamente, il contatore (count).


Infine a completamento dell’esercizio viene richiesta una classe con una Map  e metodi per inserire una coppia con ID come chiave e l’oggetto come valore, rimuovere un oggetto in base all’ID, stampare l’elenco degli articoli ordinati per prezzo crescente.

import java.util.*;

public class Database{
    private Map<Integer, Televisore> map = new HashMap<Integer, Televisore>();

    public Televisore add(Televisore tv){
        return map.put(tv.getID(), tv);
    }

    public Televisore remove(int ID){
        return map.remove(ID);
    }

    public void print(){
        List<Televisore> televisori = new ArrayList<>(map.values());
        Collections.sort(televisori);

        for(Object tv : televisori){
            System.out.println(tv);
        }
    }

    public static void main(String[] args){
        Database db = new Database();
        db.add(new Televisore(12.9, "Samso", "400x400"));
        db.add(new Televisore(110.9, "Samso", "400x400"));
        db.add(new Televisore(10.9, "Samso", "400x400"));
        db.print();
        db.remove(0);
        db.print();
    }
}

Creiamo un file e diamogli il nome che preferiamo ricordando di inserire l’estensione .java e che questo sarà lo stesso nome della nostra classe; in questo caso il file è stato chiamato “Database.java”.

Dovendo utilizzare una Map, per prima cosa importiamola scrivendo “import java.util.*“. Subito dopo scriviamo la classe chiamata Database e come unico attributo mettiamo la Map richiesta dall’esercizio. Per farlo creiamo un nuovo oggetto Map con Integer e Televisore e lo istanziamo con HashMap. Dopo creiamo il metodo per aggiungere elementi alla Map semplicemente richiamando, appunto, il metodo add e passandogli in ingresso l’oggetto passato come parametro al metodo stesso. Stesso procedimento per il metodo di rimozione elementi ma con remove al posto di add e con l’ID passato al metodo stesso.

Adesso andiamo a definire il metodo che stamperà l’elenco dei televisori presenti nella Map in ordine crescente di prezzo. Creiamo un metodo pubblico di tipo void e con nessun parametro in ingresso e chiamiamolo per esempio print. Al suo interno creiamo una List, in questo caso chiamata televisori, e istanziamola come ArrayList passando al costruttore map.values, ovvero tutti i valori presenti all’interno della Map. Questo procedimento è stato fatto per permetterci di usare il metodo sort di Collections che opera sulle List. Quindi subito dopo invochiamo tale metodo con la List creata prima come parametro in ingresso e grazie al metodo compareTo implementato al passo precedente, adesso la List sarà ordinata per come desideriamo noi. Quindi usiamo un ciclo for migliorato per stampare tutti gli elementi della List.
Infine creiamo un breve metodo main per testare le funzioni appena implementate e di conseguenza anche quelle implementate nella classe Televisore.


L’intero codice sorgente dell’esercizio si trova su Github qui!

Sei in possesso di altri compiti d’esame o esercizi e vuoi che li svolga? Contattami e inserisci il link per il download qui!
Per qualsiasi dubbio non esitare a lasciare un commento!

Testo

Scrivere una gerarchia di classi Elettrodomestico->Lavatrice. Prevedete per la classe Elettrodomestico gli attributi ID (numerico), descrizione, e costo, un costruttore parametrizzato, il metodo toString e metodi set e get per il costo. La classe Lavatrice avrà in aggiunta gli attributi modello e capacitàCarico e definirà un suo costruttore parametrizzato e il metodo toString. Utilizzate le vostre classi in un programma di esempio che crea una List in cui memorizza alcuni oggetti Elettrodomestico e alcuni oggetti Lavatrice e che verrà infine stampata a schermo.

Svolgimento

In questo esercizio ci vengono richieste due classi chiamate Elettrodomestico e Lavatrice, dove la seconda è un’estensione della prima.

Per quanto riguarda la classe Elettrodomestico vengono richiesti ID, descrizione e costo come attributi.

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;
}

Creiamo un file chiamato “Elettrodomestico.java” e scriviamo al suo interno una semplice classe chiamata Elettrodomestico con 3 attributi privati, uno di tipo Intero (ID), uno di tipo Stringa (descrizione) e il terzo (costo) di tipo Double.


Successivamente viene richiesto un costruttore parametrizzato, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;

    public Elettrodomestico(int ID, String descrizione, double costo){
        this.ID = ID;
        this.descrizione = descrizione;
        setCosto(costo);
    }
}

Inseriamo un costruttore che ha in ingresso i tre attributi definiti precedentemente (int ID, String descrizione, double costo) e al suo interno attribuiamo con il riferimento this all’ID della classe l’ID passato come parametro, stessa cosa per quanto riguarda la descrizione e per il costo mettiamo il metodo set passando la variabile costo usata come parametro del costruttore. Anche se ancora non abbiamo definito e implementato il metodo set, lo inseriamo fin da subito e lo definiremo in un secondo momento.


Poi viene richiesto il metodo toString, ovvero il metodo che viene richiamato in automatico quando stampiamo un oggetto della classe e che ci mostra le informazioni di essa.

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;

    public Elettrodomestico(int ID, String descrizione, double costo){
        this.ID = ID;
        this.descrizione = descrizione;
        setCosto(costo);
    }

    @Override
    public String toString(){
        return "ID: " + this.ID + " Descrizione: " + this.descrizione + " Costo: " + this.costo;
    }
}

Essendo il metodo toString ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere il metodo toString. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente una stringa, che si chiama appunto toString e con nessun parametro in ingresso. All’interno inseriamo un semplice return con la stringa che desideriamo restituire, solitamente si mettono i parametri importanti della classe accompagnati da una piccola descrizione.


Per terminare la classe Elettrodomestico vengono richiesti i metodi set e get per l’attributo costo

public class Elettrodomestico{
    private int ID;
    private String descrizione;
    private double costo;

    public Elettrodomestico(int ID, String descrizione, double costo){
        this.ID = ID;
        this.descrizione = descrizione;
        setCosto(costo);
    }

    public void setCosto(double costo){
        if(costo > 0){
            this.costo = costo;
        }
    }

    public double getCosto(){
        return this.costo;
    }

    @Override
    public String toString(){
        return "ID: " + this.ID + " Descrizione: " + this.descrizione + " Costo: " + this.costo;
    }
}

Quindi creiamo un metodo pubblico void per quanto riguarda setCosto e al suo interno inseriamo un if dove come condizione mettiamo che se il parametro in ingresso al metodo set è positivo (> 0), allora lo andiamo ad attribuire alla variabile della classe. Per concludere definiamo il metodo getCosto che in questo caso non fa altro che restituire il valore dell’attributo corrispondente tramite il comando return.


Per quanto riguarda la classe Lavatrice, che estenderà Elettrodomestico e quindi erediterà i suoi attributi e metodi, vengono richiesti come attributi aggiuntivi modello e capacitaCarico.

public class Lavatrice extends Elettrodomestico{
    private String modello;
    private double capacitaCarico;

}

Anche per questa classe creiamo un file chiamato “Lavatrice.java” e scriviamo al suo interno una classe chiamata Lavatrice che in questo caso estende, tramite la parola chiave extends, la classe creata precedentemente (Elettrodomestico). Inseriamo i suoi due nuovi attributi privati, uno di tipo Stringa (modello) e uno di tipo Double (capacitaCarico).


Successivamente viene richiesto un costruttore parametrizzato, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class Lavatrice extends Elettrodomestico{
    private String modello;
    private double capacitaCarico;

    public Lavatrice(int ID, String descrizione, double costo, String modello, double capacitaCarico){
        super(ID, descrizione, costo);
        setModello(modello);
        setCapacitaCarico(capacitaCarico);
    }

}

Inseriamo un costruttore che ha in ingresso sia i due attributi definiti precedentemente che gli attributi della classe Elettrodomestico, sua classe genitore (int ID, String descrizione, double costo, String modello, double capacitaCarico).

All’interno del costruttore la primissima cosa da fare è richiamare il costruttore della classe Elettrodomestico tramite l’operatore super, al quale passiamo i tre parametri che abbiamo definito all’interno della classe Elettrodomestico. Grazie all’operatore super verrà usato il costruttore della classe genitore (Elettrodomestico) per gestire i tre attributi ID, descrizione e costo per come è stato stabilito nel costruttore implementato nella classe genitore.

Subito dopo inseriamo i due metodi set relativi ai due attributi passando i parametri modello e capacitaCarico. Anche se ancora non abbiamo definito e implementato questi due metodi set, li inseriamo fin da subito e li definiremo in un secondo momento.


Per concludere ci viene richiesto il il metodo toString, ovvero il metodo che viene richiamato in automatico quando stampiamo un oggetto della classe e che ci mostra le informazioni di essa. A completamento della classe, anche se non richiesto, inseriamo anche i metodi set e get per gli attributi modello e capacitaCarico.

public class Lavatrice extends Elettrodomestico{
    private String modello;
    private double capacitaCarico;

    public Lavatrice(int ID, String descrizione, double costo, String modello, double capacitaCarico){
        super(ID, descrizione, costo);
        setModello(modello);
        setCapacitaCarico(capacitaCarico);
    }

    public void setModello(String modello){
        this.modello = modello;
    }

    public void setCapacitaCarico(double capacitaCarico){
        this.capacitaCarico = capacitaCarico;
    }

    public String getModello(){
        return this.modello;
    }

    public double getCapacitaCarico(){
        return this.capacitaCarico;
    }

    @Override
    public String toString(){
        return super.toString() + " Modello: " + this.modello + " Capacità carico: " + this.capacitaCarico;
    }
}

Essendo il metodo toString ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere il metodo toString. Subito sotto andiamo a dichiarare un metodo pubblico, che restituisce obbligatoriamente una stringa, che si chiama appunto toString e con nessun parametro in ingresso. All’interno inseriamo un semplice return con la stringa che desideriamo restituire, solitamente si mettono i parametri importanti della classe accompagnati da una piccola descrizione.

Nei metodi set attribuiamo semplicemente il parametro in ingresso all’attributo corrispondente della classe tramite il riferimento this e nei metodi get restituiamo il parametro della classe corrispondente.


Per concludere l’esercizio viene richiesta una classe per testare le due create precedentemente creando una List in cui vengono memorizzati alcuni oggetti Elettrodomestico e alcuni oggetti Lavatrice e che verrà infine stampata a schermo.

import java.util.Scanner;
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        List<Elettrodomestico> elettrodomestici = new ArrayList<>();

        for(int i = 0; i < 5; i++){
            System.out.print("ID: ");
            int ID = sc.nextInt();
            System.out.print("Descrizione: ");
            String descrizione = sc.next();
            System.out.print("Costo: ");
            double costo = sc.nextDouble();
            System.out.print("Modello:");
            String modello = sc.next();
            System.out.print("Capacità carico:");
            double capacitaCarico = sc.nextDouble();
            elettrodomestici.add(new Lavatrice(ID, descrizione, costo, modello, capacitaCarico));
        }

        for(int i = 0; i < 5; i++){
            System.out.print("ID: ");
            int ID = sc.nextInt();
            System.out.print("Descrizione: ");
            String descrizione = sc.next();
            System.out.print("Costo: ");
            double costo = sc.nextDouble();
            elettrodomestici.add(new Elettrodomestico(ID, descrizione, costo));
        }

        Iterator<Elettrodomestico> iter = elettrodomestici.iterator();

        while(iter.hasNext()){
            System.out.println(iter.next());
        }
    }
}

Per realizzare questa classe, che chiameremo Main, faremo scegliere all’utente i parametri degli oggetti Elettrodomestico e Lavatrice. Prima di tutto importiamo “import java.util.Scanner” per poter utilizare lo Scanner e “import java.util.*” per usare la classe ArrayList e l’interfaccia List. Successivamente creiamo la classe pubblica Main e al suo interno creiamo subito il classico metodo main pubblico, statico e void con in ingresso la dicitura “String[] args”. Dentro questo metodo creiamo un nuovo oggetto Scanner chiamato sc e un nuovo oggetto List di Elettrodomestico e lo istanziamo come ArrayList. Abbiamo creato la List di tipo Elettrodomestico per poter immagazzinare al suo interno entrambi i tipi di oggetto (essendo Lavatrice un’estensione di Elettrodomestico). Dopo inseriamo un ciclo for che va da 0 al numero di oggetti Lavatrice che desideriamo inserire nella List e al suo interno richiamiamo un Println per specificare cosa si sta inserendo e uno Scanner (questo procedimento va ripetuto per ogni attributo della classe); infine aggiungiamo il nuovo oggetto alla List. Lo stesso procedimento va effettuato per gli oggetti di tipo Elettrodomestico. Infine per stampare il contenuto della List creiamo un Iterator e gli attribuiamo l’Iterator della List, dentro un ciclo While inseriamo un Println di iter.next e come condizione iter.hasNext, il primo serve per richiamare l’elemento successivo della List mentre il secondo per verificare se vi sono altri elementi.


L’intero codice sorgente dell’esercizio si trova su Github qui!

Sei in possesso di altri compiti d’esame o esercizi e vuoi che li svolga? Contattami e inserisci il link per il download qui!
Per qualsiasi dubbio non esitare a lasciare un commento!

Testo

Scrivere una classe Telefono per descrivere gli articoli di un catalogo di telefoni che avranno per attributi marca, modello e annoUscita. Prevedete un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default, un metodo interattivo per settare tutti gli attributi, un metodo toString e metodi set e get. Lanciate un’eccezione quando si prova ad assegnare a un attributo un valore non valido.

Svolgimento

Nella prima parte viene richiesta una classe chiamata Telefono con attributi marca,  modello e annoUscita.

public class Telefono{
    private String marca, modello;
    private int annoUscita;
}

Creiamo un file chiamato “Telefono.java” e scriviamo al suo interno una semplice classe chiamata Telefono con 3 attributi privati, i primi due di tipo Stringa (marca e modello) e il terzo (annoUscita) di tipo intero.


Successivamente viene richiesto un costruttore senza parametri, ovvero il metodo che viene chiamato quando si crea un nuovo oggetto della classe.

public class Telefono{
    private String marca, modello;
    private int annoUscita;

    public Telefono(){
        setMarca("Default");
        setModello("Default");
        setAnnoUscita(1990);
    }
}

Inseriamo un costruttore senza alcun parametro tra le parentesi tonde e al suo interno mettiamo i tre metodi Set per i tre attributi passando dei parametri scelti da noi che saranno quelli di Default. Anche se ancora non abbiamo definito e implementato questi tre metodi set li inseriamo fin da subito e li definiremo in un secondo momento.


Poi viene richiesto un metodo interattivo per settare tutti gli attributi della classe che abbiamo precedentemente creato (marca, modello e annoUscita).

import java.util.Scanner;

public class Telefono{
    private String marca, modello;
    private int annoUscita;

    public Telefono(){
        setMarca("Default");
        setModello("Default");
        setAnnoUscita(1990);
    }

    public void setValues(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Marca: ");
        setMarca(sc.nextLine());
        System.out.println("Modello: ");
        setModello(sc.nextLine());
        System.out.println("Anno di uscita: ");
        setAnnoUscita(sc.nextInt());
    }
}

Prima di tutto, dovendo interagire con il terminale, importiamo la classe Scanner inserendo all’inizio del file la dicitura “import java.util.Scanner;“. Adesso possiamo creare il metodo void, perchè non dobbiamo restituire nessun valore, e dargli come nome per esempio setValues. Al suo interno creiamo un nuovo oggetto Scanner e per ogni attributo inseriamo un println per dare un minimo di contesto e subito dopo richiamiamo il metodo set corrispondente passandogli il metodo dell’oggetto Scanner corrispondente al tipo dell’attributo che stiamo considerando. Quindi per l’attributo marca, che è di tipo Stringa, al metodo setMarca() passiamo sc.nextLine() dove sc è l’oggetto Scanner mentre nextLine è il metodo per acquisire una riga completa come Stringa.


Successivamente viene richiesto il metodo toString, ovvero il metodo che viene richiamato in automatico quando stampiamo un oggetto della classe e che ci mostra le informazioni di essa.

import java.util.Scanner;

public class Telefono{
    private String marca, modello;
    private int annoUscita;

    public Telefono(){
        setMarca("Default");
        setModello("Default");
        setAnnoUscita(1990);
    }

    public void setValues(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Marca: ");
        setMarca(sc.nextLine());
        System.out.println("Modello: ");
        setModello(sc.nextLine());
        System.out.println("Anno di uscita: ");
        setAnnoUscita(sc.nextInt());
    }

    @Override
    public String toString(){
        return "Marca: " + this.marca + " Modello: " + this.modello + "Anno: " + this.annoUscita;
    }
}

Essendo il metodo toString ereditato dalla classe Object (tutte le classi che creiamo estendono Object), inseriamo @Override per essere sicuri di andare a sovrascrivere il metodo toString. Subito sotto andiamo a dichiarare un metodo pubblico che restituisce obbligatoriamente una stringa, che si chiama appunto toString e con nessun parametro in ingresso. All’interno inseriamo un semplice return con la stringa che desideriamo restituire, solitamente si mettono i parametri importanti della classe accompagnati da una piccola descrizione.


Infine, ci vengono richiesti i metodi set e get per i parametri inseriti in precedenza e, qualora si inserisse un parametro non valido, di lanciare un’eccezione.

import java.util.Scanner;

public class Telefono{
    private String marca, modello;
    private int annoUscita;
    private final String[] marche = {"Apple", "Samsung", "Realme", "Xiaomi"};
    private final String[] modelli = {"iPhone", "Galaxy", "GT"};

    public Telefono(){
        setMarca("Default");
        setModello("Default");
        setAnnoUscita(1990);
    }

    public void setMarca(String marca){
        for(int i = 0; i < marche.length; i++){
            if(marca.equals(marche[i])){
                this.marca = marca;
                return;
            }
        }
        throw new IllegalArgumentException();
    }

    public void setModello(String modello){
        for(int i = 0; i < modelli.length; i++){
            if(modello.equals(modelli[i])){
                this.modello = modello;
                return;
            }
        }
        throw new IllegalArgumentException();
    }

    public void setAnnoUscita(int anno){
        if(anno > 0 && anno < 2022){
            this.annoUscita = anno;
        }
        throw new IllegalArgumentException();
    }

    public String getMarca(){
        return this.marca;
    }

    public String getModello(){
        return this.modello;
    }

    public int getAnnoUscita(){
        return this.annoUscita;
    }

    public void setValues(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Marca: ");
        setMarca(sc.nextLine());
        System.out.println("Modello: ");
        setModello(sc.nextLine());
        System.out.println("Anno di uscita: ");
        setAnnoUscita(sc.nextInt());
    }

    @Override
    public String toString(){
        return "Marca: " + this.marca + " Modello: " + this.modello + "Anno: " + this.annoUscita;
    }
}

Per prima cosa andiamo a definire due array final (statici) dove inseriremo i valori che riteniamo accettabili per marca e modello, nel codice sopra li ho chiamati semplicemente marche e modelli. Adesso passiamo ai metodi set, per quanto riguarda setMarca e setModello bisogna scorrere con un ciclo for l’array che abbiamo creato precedentemente e al suo interno inserire un if dove come condizione mettiamo che se il parametro in ingresso al metodo set è uguale all’elemento dell’array che stiamo considerando, allora lo andiamo ad attribuire alla variabile della classe. Subito dopo mettiamo un return per far terminare l’esecuzione del metodo. Infine se scorrendo tutto l’array la condizione dell’if non è stata verificata, ovvero il valore che stiamo provando ad attribuire non rientra tra quelli scelti da noi, lanciamo un’eccezione tramite il comando throw, nell’esempio sopra ho scelto di lanciare IllegalArgumentException. Per quanto riguarda il metodo setAnnoUscita, essendo un numero intero, il discorso è più semplice: basterà inserire un if dove verifichiamo che il numero sia positivo (> 0) e contemporaneamente (&&) sia minore dell’anno corrente (< 2022). Per concludere definiamo i metodi get che in questo caso non fanno altro che restituire il valore dell’attributo corrispondente tramite il comando return.


L’intero codice sorgente dell’esercizio si trova su Guthub qui!

Sei in possesso di altri compiti d’esame o esercizi e vuoi che li svolga? Contattami e inserisci il link per il download qui!
Per qualsiasi dubbio non esitare a lasciare un commento!

Prova 2

  1. Scrivere una classe Telefono per descrivere gli articoli di un catalogo di telefoni che avranno per attributi marca, modello e annoUscita. Prevedete un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default, un metodo interattivo per settare tutti gli attributi, un metodo toString e metodi set e get. Lanciate un’eccezione quando si prova ad assegnare a un attributo un valore non valido.
  2. Scrivere una gerarchia di classi Elettrodomestico->Lavatrice. Prevedete per la classe Elettrodomestico gli attributi ID (numerico), descrizione, e costo, un costruttore parametrizzato, il metodo toString e metodi set e get per il costo. La classe Lavatrice avrà in aggiunta gli attributi modello e capacitàCarico e definirà un suo costruttore parametrizzato e il metodo toString. Utilizzate le vostre classi in un programma di esempio che crea una List in cui memorizza alcuni oggetti Elettrodomestico e alcuni oggetti Lavatrice e che verrà infine stampata a schermo.
  3. Scrivere una classe Televisore per rappresentare oggetti con attributi costo, modello e dimensione. Fra gli attributi prevedete anche un ID numerico autoincrementante che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi (escluso ID che è automatico) e opportune implementazioni dei metodi equals, hashCode e compareTo. Il metodo compareTo si baserà sul costo dell’oggetto (un oggetto più costoso è “maggiore” di un oggetto meno costoso), i metodi equals ed hashCode sui valori degli attributi (esclusi ID e costo). Scrivete infine una classe che contiene al suo interno una Map e metodi per inserire una coppia con ID come chiave e l’oggetto come valore, rimuovere un oggetto in base all’ID, stampare l’elenco degli articoli ordinati per prezzo crescente.

Soluzioni

Esercizio 1
Esercizio 2
Esercizio 3

Prova 5

  1. Scrivere una classe Televisore per descrivere gli articoli di un catalogo di televisori che avranno per attributi marca, modello e dimensione. Prevedete un costruttore senza parametri che inizializza tutti gli attributi a opportuni valori di default, un metodo interattivo per settare tutti gli attributi, un metodo toString e metodi set e get. Lanciate un’eccezione quando si prova ad assegnare a un attributo un valore non valido.
  2. Scrivere una gerarchia di classi Elettrodomestico->MacchlnaCaffe. Prevedete per la classe Elettrodomestico gli attributi ID (numerico), descrizione, e costo, un costruttore parametrizzato, il metodo toString e metodi set e get per il costo. La classe MacchinaCaffe avrà in aggiunta gli attributi modello e tipologia (cialde, capsule, polvere) e definirà un suo costruttore parametrizzato e il metodo toString. Utilizzate le vostre classi in un programma di esempio che crea una List In cui memorizza alcuni oggetti Elettrodomestico e alcuni oggetti MacchinaCaffe e che verrà infine stampata a schermo.
  3. Scrivere una classe Telefono per rappresentare oggetti con attributi costo, modello e annoUscita. Fra gli attributi prevedete anche un ID numerico autoincrementante che viene assegnato all’oggetto in fase di creazione e non più modificabile. Prevedete un costruttore parametrizzato che setta tutti gli attributi (escluso ID che è automatico) e opportune implementazioni dei metodi equals, hashCode e compareTo. Il metodo compareTo si baserà sul costo dell’oggetto (un oggetto più costoso è “maggiore” di un oggetto meno costoso), i metodi equals ed hashCode sui valori degli attributi (esclusi ID e costo). Scrivete infine una classe che contiene al suo interno una Map e metodi per inserire una coppia con ID come chiave e l’oggetto come valore, rimuovere un oggetto in base all’ID, stampare l’elenco degli articoli ordinati per prezzo crescente.

Soluzioni

Esercizio 1
Esercizio 2
Esercizio 3

Hai altre prove d’esame e desideri vedere come svolgerle? Mandami il link per il download qui: Contattami

Per qualsiasi dubbio o delucidazione non esitare a lasciare un commento 👍🏻