
Originariamente inviata da
veilside
Grazie della risposta ! Ma mi sapresti dire in questo caso particolare tu come lo avresti fatto? Perché quello vorrei sapere
ah... il codice. Non e` cosa buona chiedere il codice, specialmente se si tratta di un esercizio didattico.
Se fortunato che non ho niente di meglio da fare 
codice:
public interface Dictionary<K, V> extends Iterable<K> {
public void insert(K key, V value);
public void delete(K KEY);
public V search(K key);
}
public class LinkedList<K, V> implements Dictionary<K,V>{
private Record<K,V> list = null;
class Record<K1,V1> {
K1 key;
V1 value;
Record<K1, V1> successivo;
Record<K1, V1> precedente;
Record(K1 key, V1 value){
this.key = key;
this.value = value;
}
}
public Iterator<K> iterator() {
return new Iterator<K>() {
private Record<K, V> current = LinkedList.this.list;
@Override
public boolean hasNext() {
if(LinkedList.this.list == null) return false; // lista vuota
if(current == null) // prima iterazione
return true; // lista non vuota e primo elemento
else
return current.successivo != null;
}
@Override
public K next() {
if(!hasNext())
throw new NoSuchElementException();
if(current == null)
current = LinkedList.this.list;
else
current = current.successivo;
return current.key;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public void insert(K key, V value) {
Record<K, V> nuovo = new Record<K, V>(key, value);
if(list==null){
list = nuovo.successivo = nuovo.precedente = nuovo;
}else{
nuovo.successivo = list.successivo;
list.successivo.precedente = nuovo;
list.successivo = nuovo;
nuovo.precedente = list;
}
}
@Override
public void delete(K key) {
Record<K, V> p = null;
if(list!=null)
for(p=list.successivo;;p=p.successivo){
if(p.key.equals(key))
break;
if(p==list){
p = null;
break;
}
}
if(p==null)
throw new RuntimeException("elemento non trovato");
if(p.successivo == p)
list = null;
else {
if(list==p)
list = p.successivo;
p.successivo.precedente = p.successivo;
p.precedente.successivo =p.precedente;
}
}
@Override
public V search(K key) {
if(list==null)
throw new RuntimeException("lista vuota");
for(Record<K, V> p =list.successivo;;p=p.successivo){
if(p.key.equals(key))
return (V) p.value;
if(p==list)
return null;
}
}
}
ho usato una classe anonima e sistemato i generics della classe esterna (che e` largamente incompleta e piena di imprecisioni.... setter e getter totalmente assenti!)
Il codice non l`ho testato ma non ho capito perche` vuoi iterare sulle chiavi. In ogni caso, internet e` pieno di esempi di questo tipo.