Restituire insieme java.util.Set<Integer>

di il
10 risposte

Restituire insieme java.util.Set<Integer>

Ciao a tutti,
sto provando a svolgere diversi esercizi in java prima di sostenere un’esame. Dell'esercizio seguente ho svolto tutta la parte 3, ma non riesco a svolgere gli esercizi 4a e 5a. Qualcuno può darmi una mano.
Grazie!
Allegati:
26530_a8e975942dbe507ca91fcf7a3f331f94.jpg
26530_a8e975942dbe507ca91fcf7a3f331f94.jpg

26530_34dba272a10cbcedc0596f4324aabf43.jpg
26530_34dba272a10cbcedc0596f4324aabf43.jpg

10 Risposte

  • Re: Restituire insieme java.util.Set<Integer>

    marior ha scritto:


    ma non riesco a svolgere gli esercizi 4a e 5a. Qualcuno può darmi una mano.
    Sul 4a le questioni (su cui dovrai ragionare) sono queste. Hai in ingresso una lista di oggetti Animale. Dall'esercizio precedente si evince (da quanto leggo) che Animale è una interfaccia. Ora, il concetto di "età" è già noto in Animale? Ovvero ha un getEta() ? Se sì, non ci sono problemi su questo.
    Poi dovrai ovviamente creare un oggetto Set concreto, quale? Il testo non prescrive nulla a riguardo, quindi quale scegli?
    E una volta valutate queste cose, è semplice: per ciascun animale, prendi l'età e la "butti" nel set. Tutto lì. E' chiaro che essendo un Set, se 4 animali hanno la stessa età, nel Set avrai solo 1 volta quella età.

    Sul 5a devi scrivere degli unit-test per quel metodo del 4a. Dovrai scrivere più metodi di test per testare i vari casi con "input" (lista di animali) differenti. Ce ne sono diversi. Quali secondo te?
  • Re: Restituire insieme java.util.Set<Integer>

    andbin ha scritto:


    Sul 4a le questioni (su cui dovrai ragionare) sono queste. Hai in ingresso una lista di oggetti Animale. Dall'esercizio precedente si evince (da quanto leggo) che Animale è una interfaccia. Ora, il concetto di "età" è già noto in Animale? Ovvero ha un getEta() ? Se sì, non ci sono problemi su questo.
    Poi dovrai ovviamente creare un oggetto Set concreto, quale? Il testo non prescrive nulla a riguardo, quindi quale scegli?
    E una volta valutate queste cose, è semplice: per ciascun animale, prendi l'età e la "butti" nel set. Tutto lì. E' chiaro che essendo un Set, se 4 animali hanno la stessa età, nel Set avrai solo 1 volta quella età.

    Sul 5a devi scrivere degli unit-test per quel metodo del 4a. Dovrai scrivere più metodi di test per testare i vari casi con "input" (lista di animali) differenti. Ce ne sono diversi. Quali secondo te?
    Innanzitutto grazie Andrea per la tua risposta. Seguendo i tuoi consigli credo di essere riuscito a sviluppare il codice per l'esercizio 4a. Allego di seguito il codice:
    
    public interface Animale {
    	
    	public int getEta();
    	public String getNome();
    	public double getProbRiproduzione();
    }
    
    
    public abstract class AbstractAnimale implements Animale{
    	protected int eta;
    	protected String nome;
    	
    	public AbstractAnimale(int e, String n) {
    		this.eta = e;
    		this.nome = n;
    	}
    	
    	public int getEta() {
    		return this.eta;
    	}
    	
    	public String getNome() {
    		return this.nome;
    	}
    	
    	public abstract double getProbRiproduzione();
    	
    }
    
    
    public class Erbivoro extends AbstractAnimale{
    
    	private static double PROB_RIPR_ERB = 0.3;
    	
    	public Erbivoro(int e, String n) {
    		super(e,n);
    	}
    	
    	public double getProbRiproduzione() {
    		return PROB_RIPR_ERB;
    	}
    
    }
    
    
    public class Carnivoro extends AbstractAnimale{
    	
    	private static double PROB_RIPR_CARN = 0.1;
    	
    	public Carnivoro(int e, String n) {
    		super(e,n);
    	}
    	
    	public double getProbRiproduzione() {
    		return PROB_RIPR_CARN;
    	}
    	
    }
    
    
    mport static org.junit.Assert.*;
    import java.util.*;
    import org.junit.*;
    
    public class AnimaleTest {
    
    	private Set<Animale> zoo;
    	@Before 
    	public void setUp() throws Exception { 
    		this.zoo = new HashSet <Animale>(); 
    	}
    	@Test 
    	public void testEquivalenza() {
    		Animale e1 = new Erbivoro(1,"dolly");
    		Animale c1 = new Carnivoro(2,"kimba");
    		Animale c2 = new Carnivoro(2,"kimba");
    		
    		zoo.add(e1);
    		zoo.add(c1);
    		zoo.add(c2);
    		
    		assertEquals(c1,c2);
    		assertNotSame(c1,c2);
    		assertEquals(3,zoo.size());
    	}
    }
    
    
    import static org.junit.Assert.*;
    import java.util.*;
    import org.junit.*;
    
    public class AnimaliQuery{
    	
    	public static Set<Integer> eta(List<Animale> input){
    		
    		Set set = new HashSet(input); 
    		//creo l'oggetto di tipo Set
    		
    		for(int i=0; i<input.size(); i++)
    			set.add(input.get(i).getEta()); 
    			//aggiungo l'Eta di ogni elemento presente nella lista input
    
    		return set;
    	}
    	
    }
    
    Ora per procedere con l'esercizio 5a, essendo quest'ultimo metodo scritto di tipo static, dovrei richiamare prima la classe e poi il metodo senza la necessità di creare un oggetto. E' corretto? Perché in qualsiasi modo provi a scrivere il richiamo di questo metodo proprio non funziona. Puoi darmi un aiuto?
  • Re: Restituire insieme java.util.Set<Integer>

    marior ha scritto:


    credo di essere riuscito a sviluppare il codice per l'esercizio 4a. Allego di seguito il codice:
    Grosso modo è tutto giusto. Con solo alcuni appunti:

    1) eta e nome in AbstractAnimale li hai messi protected. Vuol dire che sono accessibili (e modificabili!) anche dalle sotto-classi. Di per sé non ne vedo il bisogno. Basterebbe che siano private (tanto ci sono i metodi getter).

    2) In AnimaliQuery sfrutta i generics!! E anche il "for-each"

    3) Sempre in AnimaliQuery:

    Set set = new HashSet(input);

    questo è sbagliato! Stai creando il HashSet buttandoci subito dentro tutti gli animali, in un Set che invece dovrebbe contenere solo Integer. Se avessi usato i generics, NON ti compilava ....

    marior ha scritto:


    Ora per procedere con l'esercizio 5a, essendo quest'ultimo metodo scritto di tipo static, dovrei richiamare prima la classe e poi il metodo senza la necessità di creare un oggetto. E' corretto? Perché in qualsiasi modo provi a scrivere il richiamo di questo metodo proprio non funziona. Puoi darmi un aiuto?
    eta di AnimaliQuery è static, quindi negli unit test dovrai invocarlo AnimaliQuery.eta( ..... )

    Ma il punto è che dovrai fare più casi di test e per ciascuno dovrai verificare che il risultato sia quello che ti aspetti.
  • Re: Restituire insieme java.util.Set<Integer>

    andbin ha scritto:


    Grosso modo è tutto giusto. Con solo alcuni appunti:

    1) eta e nome in AbstractAnimale li hai messi protected. Vuol dire che sono accessibili (e modificabili!) anche dalle sotto-classi. Di per sé non ne vedo il bisogno. Basterebbe che siano private (tanto ci sono i metodi getter).

    2) In AnimaliQuery sfrutta i generics!! E anche il "for-each"

    3) Sempre in AnimaliQuery:

    Set set = new HashSet(input);

    questo è sbagliato! Stai creando il HashSet buttandoci subito dentro tutti gli animali, in un Set che invece dovrebbe contenere solo Integer. Se avessi usato i generics, NON ti compilava ....
    Andrea grazie ancora per il tuo interesse. Posso chiederti per favore un esempio di come avrei dovuto utilizzare i generics e come avrei dovuto richiamare l’HashSet che contenga solo integer. Te ne sarei grato
  • Re: Restituire insieme java.util.Set<Integer>

    marior ha scritto:


    Andrea grazie ancora per il tuo interesse. Posso chiederti per favore un esempio di come avrei dovuto utilizzare i generics e come avrei dovuto richiamare l’HashSet che contenga solo integer. Te ne sarei grato
    Tu avevi scritto:

    Set set = new HashSet(input);

    che è comunque sbagliato (passare la lista di animali)

    Dovevi fare:

    Set<Integer> set = new HashSet<Integer>();

    Se anche tentavi di passare input a questo costruttore, ti dava errore, grazie ai generics.
  • Re: Restituire insieme java.util.Set<Integer>

    andbin ha scritto:


    Tu avevi scritto:

    Set set = new HashSet(input);

    che è comunque sbagliato (passare la lista di animali)

    Dovevi fare:

    Set<Integer> set = new HashSet<Integer>();

    Se anche tentavi di passare input a questo costruttore, ti dava errore, grazie ai generics.
    Seguendo i tuoi consigli ho riscritto il codice in questo modo:
    
    public class AnimaliQuery{
    	
    	public static Set<Integer> eta(List<Animale> input){
    		
    		Set<Integer> set = new HashSet<Integer>(); 
    		//creo l'oggetto di tipo Set<Integer>
    		
    		for(int i=0; i<input.size(); i++)
    			set.add(input.get(i).getEta()); 
    			//aggiungo l'Eta di ogni elemento presente nella lista input
    		
    		return set;
    	}
    }
    
    Poi ho aggiunto il seguente metodo "TestQuery" alla classe AnimaliTest:
    
    public void TestQuery() {
    		Set<Integer> Eta_zoo = new HashSet<Integer>();
    		Eta_zoo = AnimaliQuery.eta((List<Animale>) zoo);
    		
    		System.out.println(Eta_zoo.toString());
    	
    		assertEquals(Eta_zoo.size(),zoo.size());
    		assertTrue(Eta_zoo.isEmpty());
    		
    	}
    
    Come ti sembra?
  • Re: Restituire insieme java.util.Set<Integer>

    marior ha scritto:


    Seguendo i tuoi consigli ho riscritto il codice in questo modo:
    Ti avevo anche suggerito di usare il "for-each", lo conosci?

    marior ha scritto:


    Poi ho aggiunto il seguente metodo "TestQuery" alla classe AnimaliTest:
    No, qui non ci siamo. Innanzitutto ne dovresti fare diversi di test. Giusto alcuni che mi vengono in mente:
    - lista vuota di animali ... cosa ti aspetti in uscita?
    - lista con 1 animale di età x ... cosa ti aspetti in uscita?
    - lista con 2 animali della stessa età x ... cosa ti aspetti in uscita?
    - lista con 2 animali di eta diversa ... cosa ti aspetti in uscita?

    Devi testare proprio il contenuto del Set in uscita, non tanto/solo la sua dimensione.
  • Re: Restituire insieme java.util.Set<Integer>

    andbin ha scritto:


    marior ha scritto:


    Seguendo i tuoi consigli ho riscritto il codice in questo modo:
    Ti avevo anche suggerito di usare il "for-each", lo conosci?
    Non lo conosco purtroppo.

    andbin ha scritto:


    marior ha scritto:


    Poi ho aggiunto il seguente metodo "TestQuery" alla classe AnimaliTest:
    No, qui non ci siamo. Innanzitutto ne dovresti fare diversi di test. Giusto alcuni che mi vengono in mente:
    - lista vuota di animali ... cosa ti aspetti in uscita?
    - lista con 1 animale di età x ... cosa ti aspetti in uscita?
    - lista con 2 animali della stessa età x ... cosa ti aspetti in uscita?
    - lista con 2 animali di eta diversa ... cosa ti aspetti in uscita?

    Devi testare proprio il contenuto del Set in uscita, non tanto/solo la sua dimensione.
    Posso chiederti un paio di esempi, in base al codice scritto, di quanto da te suggerito per favore?
  • Re: Restituire insieme java.util.Set<Integer>

    andbin ha scritto:


    marior ha scritto:


    Seguendo i tuoi consigli ho riscritto il codice in questo modo:
    Ti avevo anche suggerito di usare il "for-each", lo conosci?

    marior ha scritto:


    Poi ho aggiunto il seguente metodo "TestQuery" alla classe AnimaliTest:
    No, qui non ci siamo. Innanzitutto ne dovresti fare diversi di test. Giusto alcuni che mi vengono in mente:
    - lista vuota di animali ... cosa ti aspetti in uscita?
    - lista con 1 animale di età x ... cosa ti aspetti in uscita?
    - lista con 2 animali della stessa età x ... cosa ti aspetti in uscita?
    - lista con 2 animali di eta diversa ... cosa ti aspetti in uscita?

    Devi testare proprio il contenuto del Set in uscita, non tanto/solo la sua dimensione.
    Potrebbe essere questo un esempio di test usando il metodo for-each?
    for (Integer temp : Eta_zoo) {
    	        System.out.println(temp);
    	        assertTrue(temp==1);
    	     }
  • Re: Restituire insieme java.util.Set<Integer>

    marior ha scritto:


    Potrebbe essere questo un esempio di test usando il metodo for-each?
    for (Integer temp : Eta_zoo) {
    	        System.out.println(temp);
    	        assertTrue(temp==1);
    	     }
    No, il "for-each" non ti serve nei test. Ti serviva nel eta() dove "scorri" la lista di animali.
Devi accedere o registrarti per scrivere nel forum
10 risposte