Esercizio verifica limite da non superare con gli arrayList

di il
14 risposte

Esercizio verifica limite da non superare con gli arrayList

Salve, devo risolvere una piccola parte di un breve esercizio.
In pratica si tratta della gestione di una sala cinematografica. Ho una arrayList di film che andranno in proiezione durante le settimana. Inizialmente la lista è vuota ma posso inserirne a piacere con un'unica eccezione: al max 2 film su 20 potranno appartenere al genere horror. Come faccio questo controllo? Scrivo dello pseudo codice (non ho il pc con me).
class Film
private String genere;

class gestioneCinema
private List<Film> films;

int contaHorror(List<Film> films, int contatore){
ciclo l'array controllando se la proprietà "genere" è uguale ad "horror" e nel caso incremento il contatore di 1

void aggiungiFilm(Film film, List<Film> films, int cont){
cont = contaHorror(List<Film> films, int contatore);
if(genere del film da inserire è != da horror films.add(film))
else{
if(cont<2 films.add(film))
else non inserire gestendo l'eccezione.
Opinione? grazie mille

14 Risposte

  • Re: Esercizio verifica limite da non superare con gli arrayList

    WinstonSmith ha scritto:


    posso inserirne a piacere con un'unica eccezione: al max 2 film su 20 potranno appartenere al genere horror. Come faccio questo controllo?
    Chiaramente è bene "incapsulare" la lista in una classe apposita (dallo pseudo codice, lo fai ok con una classe GestioneCinema) e il metodo di inserimento dovrà ovviamente andare a contare quanti film sono del genere horror. E chiaramente devi anche verificare se quello che stai inserendo è horror o no. Se quelli presenti+quello inserito non causano > 2 film horror, allora inserisci.

    Poi materialmente si può scrivere in diversi modi ma il succo è quello.
  • Re: Esercizio verifica limite da non superare con gli arrayList

    andbin ha scritto:


    WinstonSmith ha scritto:


    posso inserirne a piacere con un'unica eccezione: al max 2 film su 20 potranno appartenere al genere horror. Come faccio questo controllo?
    Chiaramente è bene "incapsulare" la lista in una classe apposita (dallo pseudo codice, lo fai ok con una classe GestioneCinema) e il metodo di inserimento dovrà ovviamente andare a contare quanti film sono del genere horror. E chiaramente devi anche verificare se quello che stai inserendo è horror o no. Se quelli presenti+quello inserito non causano > 2 film horror, allora inserisci.

    Poi materialmente si può scrivere in diversi modi ma il succo è quello.
    Grazie, andBin.
    Trovi sia più corretto un unico metodo "inserisciFilm" con nella sua implementazione le verifiche sul num totale di film e sul quelli horror, oppure tre diversi metodi: uno che restituisce il totale, uno il tot di quelli horror ed uno che inserisce (nel corpo del metodo metto il richiamo agli altri due metodi) ?

    Scusami, un'altra domanda sulla classe gestioneCinema... Come detto avrà come attributo una lista di film... E al costruttore dovrò semplicemente passare la lista, con poi this.lista = lista ?

    Grazie
  • Re: Esercizio verifica limite da non superare con gli arrayList

    WinstonSmith ha scritto:


    Trovi sia più corretto un unico metodo "inserisciFilm" con nella sua implementazione le verifiche sul num totale di film e sul quelli horror, oppure tre diversi metodi: uno che restituisce il totale, uno il tot di quelli horror ed uno che inserisce (nel corpo del metodo metto il richiamo agli altri due metodi) ?
    Dovessi farlo io farei (abbozzato):
    public class GestioneCinema {
        private List<Film> films;
        
        // .. costruttore ecc...
    
        public void aggiungiFilm(Film film) {
    	// se il film in argomento è "horror", usa contaFilmDiGenere, ecc...
    	// .....
        }
    
        public int contaFilmDiGenere(String genere) {
            //........
        }
    }
    Nota che a un metodo come aggiungiFilm NON devi passare un List<Film> films, non ha senso ..

    WinstonSmith ha scritto:


    E al costruttore dovrò semplicemente passare la lista, con poi this.lista = lista ?
    Attenzione, perché se riceve direttamente una lista, qualcuno potrebbe passare una lista che viola il concetto di "max 2 horror".
    Quindi o costruisci sempre con lista vuota iniziale (e si deve sempre usare aggiungiFilm) oppure all'atto della costruzioni verifichi che la lista in input alla costruzione non violi le regole stabilite.
  • Re: Esercizio verifica limite da non superare con gli arrayList

    Perfetto, grazie mille.
  • Re: Esercizio verifica limite da non superare con gli arrayList

    Ricollegandomi a questa esercitazione, ci sono state diverse aggiunte, non riesco a gestirne una:
    al momento dell'inserimento del film nella nostra lista (che ha una dimensione fissa), se di genere horror dovrà finire nell'ultimo 10% di posti liberi disponibile... non riesco ad uscirne, potreste darmi qualche indicazione? grazie
  • Re: Esercizio verifica limite da non superare con gli arrayList

    WinstonSmith ha scritto:


    al momento dell'inserimento del film nella nostra lista (che ha una dimensione fissa), se di genere horror dovrà finire nell'ultimo 10% di posti liberi disponibile... non riesco ad uscirne, potreste darmi qualche indicazione? grazie
    Chiariamo una cosa innanzitutto, se usi un ArrayList, esso è espandibile arbitrariamente, quindi qualunque limite sulla dimensione lo devi gestire tu con della "logica" apposita.
    Detto questo, bisognerebbe chiarire meglio il senso del "ultimo 10% di posti liberi". Presumo che tu ad ogni inserimento aggiungi sempre "al fondo" (con add() ), no?
    Ok, quindi gli "horror" devono SEMPRE stare tutti al fondo? Per chiarire meglio: aggiungi un horror, è l'ultimo della lista. Poi aggiungi un NON-horror ... dove deve stare? Dopo il horror o prima del horror?
  • Re: Esercizio verifica limite da non superare con gli arrayList

    andbin ha scritto:



    Chiariamo una cosa innanzitutto, se usi un ArrayList, esso è espandibile arbitrariamente, quindi qualunque limite sulla dimensione lo devi gestire tu con della "logica" apposita.
    Detto questo, bisognerebbe chiarire meglio il senso del "ultimo 10% di posti liberi". Presumo che tu ad ogni inserimento aggiungi sempre "al fondo" (con add() ), no?
    Ok, quindi gli "horror" devono SEMPRE stare tutti al fondo? Per chiarire meglio: aggiungi un horror, è l'ultimo della lista. Poi aggiungi un NON-horror ... dove deve stare? Dopo il horror o prima del horror?
    Ho dimenticato una cosa... sono passato (su richiesta della traccia) da un arrayList ad una HashMap(chiave un Integer che determina la sua posizione, mentre valore l'oggetto Film). E' permesso aggiungere film finchè la dimensione della mappa è inferiore a 20, gestisco il tutto con un ciclo while ed una costante "MAX".

    nel caso in cui il film NON sia un horror si potrà scegliere liberamente il posto
    nel caso in cui il posto scelto sia occupato il sistema dovrà mostrare un messaggio e permettere all’utente di riprovare
    nel caso sia un horror sarà il sistema a assegnargli il primo posto libero nell’ultima parte della mappa, se c’è un posto libero in quella sezione, altrimenti lancia un messaggio di errore
    il sistema deve permettere di inserire un film nel primo posto libero disponibile tra il primo 90% dei posti se non è horror, tra l’ultimo se lo è

    quindi un horror finirà semplicemente smepre nel posto numero 19 o 20, sia se si scegli manualmente sia se verrà scelto dall'utente la posizione?
    E se non lo è va solo nei primi 18? non c'è scritto da nessuna parte che non si possa avere una collezione senza horror, questo mi confonde...
  • Re: Esercizio verifica limite da non superare con gli arrayList

    WinstonSmith ha scritto:


    Ho dimenticato una cosa... sono passato (su richiesta della traccia) da un arrayList ad una HashMap(chiave un Integer che determina la sua posizione, mentre valore l'oggetto Film). E' permesso aggiungere film finchè la dimensione della mappa è inferiore a 20, gestisco il tutto con un ciclo while ed una costante "MAX".
    Onestamente è un po' "bruttino" ma se è richiesto così ...... vabbè, ok.

    WinstonSmith ha scritto:


    nel caso in cui il film NON sia un horror si potrà scegliere liberamente il posto
    nel caso in cui il posto scelto sia occupato il sistema dovrà mostrare un messaggio e permettere all’utente di riprovare
    nel caso sia un horror sarà il sistema a assegnargli il primo posto libero nell’ultima parte della mappa, se c’è un posto libero in quella sezione, altrimenti lancia un messaggio di errore
    il sistema deve permettere di inserire un film nel primo posto libero disponibile tra il primo 90% dei posti se non è horror, tra l’ultimo se lo è
    Ok, chiaro.

    WinstonSmith ha scritto:


    quindi un horror finirà semplicemente smepre nel posto numero 19 o 20, sia se si scegli manualmente sia se verrà scelto dall'utente la posizione?
    Domanda: c'è scritto espressamente che è l'UTENTE a poter scegliere una posizione? Credo (e spererei) di no .. Quindi sarebbe solo la "logica" del tuo aggiungiFilm(Film) che "sa" come determinare la posizione.

    Nel caso di "horror" se MAX è 20, appunto il 10% sono solo 2 posizioni. Quindi aggiungiFilm dovrebbe ragionare così per un horror:
    - è libero il posto 19? Sì ---> mette nel 19
    - altrimenti è libero il posto 20? Sì ---> mette nel 20
    - altrimenti segnalazione errore

    Stop, tutto qui.

    WinstonSmith ha scritto:


    E se non lo è va solo nei primi 18? non c'è scritto da nessuna parte che non si possa avere una collezione senza horror, questo mi confonde...
    Questa è un'altra questione (da valutare/verificare). Quel 10% dello spazio è ESCLUSIVO per gli horror oppure no?
    Ma alla fin fine la logica di inserimento cambia relativamente poco. Se NON è horror, presumo che sia sufficiente cercare il primo posto "libero".

    Quindi per quelli NON horror:
    - se si intende che il 10% è esclusivo per gli horror, allora la ricerca di un posto per un non-horror si fermerà al posto 18.
    - se si intende che il 10% NON è esclusivo per gli horror, allora la ricerca di un posto per un non-horror si fermerà al posto 20.

    E la logica che ho detto prima per gli horror continua a funzionare, cioè se c'è posto bene, altrimenti errore.
  • Re: Esercizio verifica limite da non superare con gli arrayList

    andbin ha scritto:


    Domanda: c'è scritto espressamente che è l'UTENTE a poter scegliere una posizione? Credo (e spererei) di no .. Quindi sarebbe solo la "logica" del tuo aggiungiFilm(Film) che "sa" come determinare la posizione.

    Nel caso di "horror" se MAX è 20, appunto il 10% sono solo 2 posizioni. Quindi aggiungiFilm dovrebbe ragionare così per un horror:
    - è libero il posto 19? Sì ---> mette nel 19
    - altrimenti è libero il posto 20? Sì ---> mette nel 20
    - altrimenti segnalazione errore

    Stop, tutto qui.
    Sì.
    L'utente può: inserire un film (e questo verrà inserito nella prima posizione disponibile) oppure inserire un film scegliendo dove posizionarlo.
    Nel primo caso, per l'inserimento in sequenza, ho pensato ad una variabile statica che viene incrementata ogni volta che si va ad inserire un film, e quella variabile rappresenta la chiave della mia hashMap. Nel secondo, semplicemente il numero digitato (se disponibile) diventa la chiave.
    Ovviamente c'è poi un controllo, visto che non è possibile inserire un film in una posizione già occupata.

    Da nessuna parte dice che bisogna avere una collezione da 18 + 2, quindi presumo che i NON horror passano andare da 1 a 20 e solo sugli horror serva il controllo che limita alle ultime due posizioni...

    Poi bisogna fare un'altra verifica.. al momento dell'inserimento bisogna vedere - in base al titolo - se l'oggetto film è già presenta nella collezione, in quel caso viene lanciata un'eccezione. E' una buona idea ridefinire il metodo equals di Film?
  • Re: Esercizio verifica limite da non superare con gli arrayList

    WinstonSmith ha scritto:


    L'utente può: inserire un film (e questo verrà inserito nella prima posizione disponibile) oppure inserire un film scegliendo dove posizionarlo.
    Ok, allora ci saranno 2 metodi per l'inserimento: uno con posizione, l'altro senza.

    WinstonSmith ha scritto:


    Nel primo caso, per l'inserimento in sequenza, ho pensato ad una variabile statica
    "static" dimenticalo. Non serve in questi casi.

    WinstonSmith ha scritto:


    che viene incrementata ogni volta che si va ad inserire un film, e quella variabile rappresenta la chiave della mia hashMap.
    Ma si possono eliminare dei film? E quindi rimane il "buco"? E come vuoi trattarlo?

    WinstonSmith ha scritto:


    al momento dell'inserimento bisogna vedere - in base al titolo - se l'oggetto film è già presenta nella collezione, in quel caso viene lanciata un'eccezione. E' una buona idea ridefinire il metodo equals di Film?
    Ridefinire il equals() di Film in generale è ok. Se la tua logica di inserimento si basa su quel equals(), ancora è tutto ok. Ma appunto come funziona dipende appunto dal equals().
  • Re: Esercizio verifica limite da non superare con gli arrayList

    andbin ha scritto:


    Ok, allora ci saranno 2 metodi per l'inserimento: uno con posizione, l'altro senza.
    Ecco, io ne avevo pensato uno solo... Nel menù veniva chiesto se scegliere o meno la posizione, in base alla risposta andava nell'if (dove trovava il contatore) o nell'else (dove inseriva da tastiera il valore della posizione/chiave)

    andbin ha scritto:


    Ma si possono eliminare dei film? E quindi rimane il "buco"? E come vuoi trattarlo?

    Questa è una cosa che forse non ho capito delle HashMap. Sì, è possibile eliminare un film. Per come l'avevo immaginata io, restava quindi una posizione vuota, tipo: Se scegli di eliminare il film numero 3 (quindi elimino quello con chiave 3). A questo punto avrò posizioni 1,2,4,5,... occupate e l'utente potrà scegliere se eventualmente occupare la numero 3. Ma per la variabile contatore non c'ho pensato... forse l'inserimento deve passare per un ciclo while (con i che va avanti fino a <MAX) e dove trova un valore nullo per quell'indice va ad inserire il film? A questo punto però il contatore non serve più...

    andbin ha scritto:


    Ridefinire il equals() di Film in generale è ok. Se la tua logica di inserimento si basa su quel equals(), ancora è tutto ok. Ma appunto come funziona dipende appunto dal equals().
    Ok, quindi sempre nel metodo per l'inserimento devo andare a fare un controllo con equals() sul titolo.
    Altra cosa che devo capire è come recuperare da una mappa un valore (titolo in questo caso) di un determianto oggetto per andare poi a fare il confronto.
  • Re: Esercizio verifica limite da non superare con gli arrayList

    WinstonSmith ha scritto:


    Ecco, io ne avevo pensato uno solo...
    No, meglio due:
    aggiungiFilm(Film film)

    e poi es.

    inserisciFilm(Film film, int posizione)

    (puoi anche chiamarlo aggiungiFilm, diventa solo un "overload" dell'altro).

    WinstonSmith ha scritto:


    Questa è una cosa che forse non ho capito delle HashMap. Sì, è possibile eliminare un film. Per come l'avevo immaginata io, restava quindi una posizione vuota, tipo: Se scegli di eliminare il film numero 3 (quindi elimino quello con chiave 3). A questo punto avrò posizioni 1,2,4,5,... occupate e l'utente potrà scegliere se eventualmente occupare la numero 3. Ma per la variabile contatore non c'ho pensato... forse l'inserimento deve passare per un ciclo while (con i che va avanti fino a <MAX) e dove trova un valore nullo per quell'indice va ad inserire il film? A questo punto però il contatore non serve più...
    Appunto, se puoi avere valori a posizioni "sparse", un contatore è poco/nulla utile.

    Tieni presente che per le Map che accettano valori null (es. HashMap), se fai get(chiave) e ti restituisce null può voler dire 2 cose: che la associazione non esiste proprio oppure che la chiave è associata ad un valore null. Solo dal get non si riesce a sapere quale dei due casi è.
    Se invece vuoi testare che la chiave esista davvero oppure no, c'è il containsKey(Object key)

    WinstonSmith ha scritto:


    Ok, quindi sempre nel metodo per l'inserimento devo andare a fare un controllo con equals() sul titolo.
    Altra cosa che devo capire è come recuperare da una mappa un valore (titolo in questo caso) di un determianto oggetto per andare poi a fare il confronto.
    Se implementi il equals() in Film per confrontare il titolo, poi dalla mappa devi solo prendere il valore (il Film) e farci il equals() con il Film passato al aggiungiFilm (valuta tu su quale dei due invocare equals).
  • Re: Esercizio verifica limite da non superare con gli arrayList

    andbin ha scritto:


    Se implementi il equals() in Film per confrontare il titolo, poi dalla mappa devi solo prendere il valore (il Film) e farci il equals() con il Film passato al aggiungiFilm (valuta tu su quale dei due invocare equals).
    Quindi banalmente un qualcosa tipo mappa.get(k).getTitolo() ? Perché avevo sentito di un values()...

    Grazie ancora per avermi aiutato a ragionare ed avermi risolto gli errori.
  • Re: Esercizio verifica limite da non superare con gli arrayList

    WinstonSmith ha scritto:


    Quindi banalmente un qualcosa tipo mappa.get(k).getTitolo() ?
    Se vuoi confrontare tu direttamente i due titoli, sì. Prendi il titolo dal Film passato al aggiungiFilm, prendi il titolo dal Film nella mappa e ... confronti con equals.
    Se invece ridefinisci tu il equals() in Film implementandolo per confrontare il titolo, allora poi nel aggiungiFilm devi solo confrontare con equals i due oggetti Film, non i titoli.

    WinstonSmith ha scritto:


    Perché avevo sentito di un values()...
    values() tira fuori una Collection di tutti i valori. Serve principalmente/tipicamente quando si vuole iterare sui valori. Non ti serve affatto in questo caso.

    WinstonSmith ha scritto:


    Grazie ancora per avermi aiutato a ragionare ed avermi risolto gli errori.
    Prego, sono qui apposta ..
Devi accedere o registrarti per scrivere nel forum
14 risposte