g.lombardo4 ha scritto:
ma cercando di iterare con un for tutti gli elementi dell'albero si presenta un errore: Can only iterate over an array or an instance of java.lang.Iterable
1)
Se vuoi che il target del
enhanced-for (il "for-each") sia direttamente un oggetto Albero, allora è Albero che deve implementare Iterable:
public class Albero<T extends Comparable<
? super T>>
implements Iterable<T>
E nota che ho scritto Comparable<
? super T> ... perché? Perché questa è la forma più "ampia" e corretta.
Allora sì, puoi fare for (UnTipo v :
albero)
Se invece volessi dare la possibilità di iterare in vari modi (quelli noti nella teoria degli "alberi"), cioè es. pre-order, post-order, ecc... allora basta mettere in Albero dei metodi es.
public Iterable<T> preOrder()
public Iterable<T> postOrder()
ecc....
poi es.
for (UnTipo v : albero.postOrder())
Naturalmente si potrebbero anche fare entrambe le cose, cioè: Albero che implementa Iterable (per l'iterazione che tu definisci come "standard"), più i metodi citati per altri modi di iterazione più particolari.
2)
La implementazione in Albero è comunque sbagliata riguardo il tipo di dato usato. Albero è una classe "generica", dichiara una
type variable T. Questo significa che NON devi mettere
public void insert(String parola)
ma
public void insert(
T elemento)
e così via.
E ovviamente il metodo:
private int compare(String o1, String o2)
non ha senso. Non "sai" se sono stringhe, non puoi usare length(), ecc....
L'unica cosa che sai è che grazie al
T extends Comparable, sicuramente tutti gli oggetti trattati da Albero saranno "comparabili", quindi avranno di certo il metodo
int compareTo(T altro) ed è su questo che deve basarsi tutta la logica di inserimento/ricerca.
Non ho verificato il resto.