Esercizio

di il
5 risposte

Esercizio

Allora ragazzi non me ne esco proprio ad uscire da questo esercizio che simula il funzionamento di una videoteca.
ecco la classe FIlm
public class Film 
{
	private String nome;
	private String genere;
	private int mediaRecensione;
	
	//Costruttore
	public Film(String nome,String genere,int mediaRecensione)
	{
		this.setGenere(genere);
		this.setNome(nome);
		this.setMediaRecensione(mediaRecensione);
	}


	//metodi setter e getter
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getGenere() {
		return genere;
	}

	public void setGenere(String genere) {
		this.genere = genere;
	}

	public int getMediaRecensione() {
		return mediaRecensione;
	}

	public void setMediaRecensione(int mediaRecensione) {
		this.mediaRecensione = mediaRecensione;
	}
	
	@Override
	public String toString()
	{
		return getNome();
	}
}
ora la classe della videoteca

public class Videoteca 
{
	private Film[] films;

	//Costruttore
	public Videoteca()
	{
		films = new Film[10];
		caricaFilm();

	}

	//Getter and setter
	public Film[] getFilms() {
		return films;
	}

	public void setFilms(Film[] films) {
		this.films = films;
	}
	
	public Film[] getFilmFiltrati(FiltroFilm filtrofilm)
	{
		Film[] filmFiltrati = new Film[10];
		for (int i=0,j=0;i<10;i++)
		{
			if(filtrofilm.filtra(films[i]))
			{
				filmFiltrati[j]=films[i];
				j++;
			}
		}
		return filmFiltrati;
	}
	
	private void caricaFilm() 
	{
		System.out.println("Caricamento film..");
		films[0]= new Film("La preda perfetta","azione",7);
		films[1]= new Film("harryPotter","fantascienza",10);
		films[2]= new Film("Dragonball","cartone",10);
		films[3]= new Film("La preda perfetta","azione",7);
		films[4]= new Film("Goal","sport",3);
		films[5]= new Film("Mordecai","comico",2);
		films[6]= new Film("Fast and Furious","azione",10);
		films[7]= new Film("I sette nani","fantascienza",6);
		films[8]= new Film("naruto","cartone",6);
		films[9]= new Film("sfdfag","fantascienza",1);
		//films[10]= new Film("hhhhhr","azione",10);
		
	}
}
l'interfaccia Filtrofilm
@FunctionalInterface
public interface FiltroFilm 
{
	boolean filtra(Film film);
}

ed infine la classe di test

public class TestVideoteca 
{
public static void main(String[] args) 
{
	Videoteca videoteca = new Videoteca();
	
	System.out.println("Bei film:..");
	Film[] beiFilm = videoteca.getFilmFiltrati((Film film)->film.getMediaRecensione()>3);
	for(int i =0;i<beiFilm.length;i++)
	{
		System.out.println(beiFilm[i]);
	};
	System.out.println("Film di fantascienza..");
	Film[] filmFantascienza = videoteca.getFilmFiltrati((Film film)->film.getGenere().equals("fantascienza"));
	for(int i =0;i<filmFantascienza.length;i++)
	{
		System.out.println(filmFantascienza[i]);
	}
}	
}
il problema è proprio che non riresco a visualizzare bene i risultati, mi stampa sempre 10 film mettendo null a quelli che non rispecchiano il filtro, ma non dovrebbero tornare alle variabili sono i film giusti??

5 Risposte

  • Re: Esercizio

    ercucchiaio ha scritto:


    il problema è proprio che non riresco a visualizzare bene i risultati, mi stampa sempre 10 film mettendo null a quelli che non rispecchiano il filtro, ma non dovrebbero tornare alle variabili sono i film giusti??
    L'array che crei e restituisci in getFilmFiltrati è sempre e comunque di 10 elementi! Se di film filtrati ce ne sono di meno, staranno all'inizio dell'array e il resto dei reference nell'array saranno chiaramente null.


    P.S.
    - classe Film ok (i this. nel costruttore sono superflui ma leciti)
    - classe Videoteca ... uhm, più o meno. Quello che "stona" è il caricaFilm(). Se Videoteca rappresenta solo un "insieme" di film, non dovrebbe avere alcuna logica per "caricare" i film (tanto meno (!) se fosse input da utente).
    Tra l'altro Videoteca è poco più di un array, insomma è uno strato molto sottile al di sopra di un array di Film.
    - interfaccia FiltroFilm ok.
  • Re: Esercizio

    public class TestVideoteca 
    {
    public static void main(String[] args) 
    {
    	Videoteca videoteca = new Videoteca();
    	
    	System.out.println("Bei film:..");
    	Film[] beiFilm = videoteca.getFilmFiltrati((Film film)->film.getMediaRecensione()>3);
    	for(int i =0;i<beiFilm.length;i++)
    	{
    		if(beiFilm[i]!=null)
    		{
    		System.out.println(beiFilm[i]);
    		}
    	};
    	System.out.println("Film di fantascienza..");
    	Film[] filmFantascienza = videoteca.getFilmFiltrati((Film film)->film.getGenere().equals("fantascienza"));
    	for(int i =0;i<filmFantascienza.length;i++)
    	{
    		if(filmFantascienza[i]!=null)
    		{
    		System.out.println(filmFantascienza[i]);
    		}
    	}
    }	
    }
    
    aggiustata così, perfetto , grazie.
  • Re: Esercizio

    ercucchiaio ha scritto:


    aggiustata così, perfetto , grazie.
    Testare "a valle" i null ovviamente è tecnicamente ok ma .... innanzitutto devi replicare il test ogni volta. Se facessi 30 getFilmFiltrati, replichi il test 30 volte!

    La cosa più corretta (e sensata) sarebbe quella di fare in modo che getFilmFiltrati restituisca un array con il giusto numero di elementi.
  • Re: Esercizio

    L'avevo pensato ma non ho capito come fare..
  • Re: Esercizio

    ercucchiaio ha scritto:


    l'avevo pensato ma non ho capito come fare..
    1) Preverifichi quanti film verrebbero filtrati. Oltre al fatto che il filtra() lo invochi il doppio del necessario, lo stato dei film "potrebbe" cambiare dalla preverifica al filtro effettivo. Nel tuo scenario no, è semplice e tutto controllato da te. Ma in generale esiste la possibilità di discrepanze. Essendo qualcosa di "didattico", nel tuo caso si può anche fare.

    oppure

    2) Ad ogni film filtrato da aggiungere, istanzi un nuovo array più grande di 1 elemento, ricopi i film dal vecchio array e aggiungi in coda il nuovo film. Inefficiente in generale, ma idem se scenario "didattico" può essere accettabile.

    oppure

    3) Sfrutti una collezione es. ArrayList. Se poi vuoi far restituire un array, puoi ottenerlo dal ArrayList. Al limite potresti anche restituire la lista invece che un normale array!

    oppure

    4) Replichi con gli array la logica di ridimensionamento/espansione di ArrayList. Simile al 2) ma in modo più furbo ... e non solo 1 elemento in più ma con capacità maggiore. Non credo ti convenga questa soluzione.
Devi accedere o registrarti per scrivere nel forum
5 risposte