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?