qui vi è la traccia del problema intero:
codice:
È definita la seguente interfaccia relativa ad una lista di oggetti (liberamente ispirata a List<T> di java.util):
public interface Lista<T> extends Iterable<T>{
public int size();
public void clear();
public void addFirst( T elem );
public void addLast( T elem );
public T getFirst();
public T getLast();
public T removeFirst();
public T removeLast();
public boolean isEmpty();
public boolean isFull();
public void sort( Comparator<T> c );
public ListIterator<T> listIterator();
public ListIterator<T> listIterator( int start );
}//Lista
Progettare e sviluppare:
• una classe astratta ListaAstratta<T>, che implementa l’interfaccia Lista<T> e concretizza quanti più
metodi è possibile, e sicuramente equals(), toString(), hashCode()
• una classe concreta ListaConcatenata<T> erede di ListaAstratta<T> e basata su puntatori espliciti. In
particolare, la classe deve realizzare una lista doppiamente concatenata (ogni nodo ha il puntatore al
successivo (next) e al precedente (prior)) in modo da essere “navigabile” indifferentemente “in avanti” o
“indietro”.
Rilevante nella classe ListaConcatenata<T> è l’implementazione del ListIterator<T>. A questo proposito si
suggerisce di introdurre una inner class in cui il cursore (iteratore) può essere null o se non null punta ad un
nodo non ancora processato (situazione più vicina alla “visione astratta” di un iteratore). Il cursore può essere
null in due casi (da distingere): prima del primo elemento o dopo l’ultimo elemento (quest’ultima circostanza si
verifica anche quando la lista è vuota).
Il metodo sort() riceve un oggetto Comparator<T> e ordina, ad esempio con algoritmo bubble sort, la lista.
Attenzione che quando uno scambio è richiesto tra i contenuti di due nodi, vanno scambiate sole le
informazioni. Non toccare i puntatori durante gli scambi.
vi posto il codice che ho creato, a parte qualche piccolo difettuccio che raddrizzerò più tardi, mi interessa ora il funzionamento di Iterator.
innanzi tutto devo implementare l'interfaccia di cui sopra, poi dev realizzare una classe astratta dove poter concretizzare quanti più metodi possibili:
codice:
package progetto1;
import java.util.*;
public abstract class ListaAstratta<T extends Comparable<? super T>> implements Lista<T>{
// _______________
public abstract void sort( Comparator<T> c );// |
public abstract ListIterator<T> listIterator();// |
public abstract ListIterator<T> listIterator( int start );// |_________________
public abstract void addFirst( T elem );// |
public abstract void addLast( T elem );// DA IMPLEMENTARE IN CLASSE CONCRETA |
public abstract T getFirst();// __________________|
public abstract T getLast();// |
public abstract T removeFirst();// |
public abstract T removeLast();// |
public abstract void add( T elem );//_________________________|
public boolean equals( Object o ){
if( !(o instanceof ListaAstratta) ) return false;
if( o==this ) return true;
ListaAstratta<T> s=(ListaAstratta<T>)o;
if( s.size()!=this.size() ) return false;
Iterator<T> it1=this.iterator();
Iterator<T> it2=s.iterator();
while( it1.hasNext() ){
T e1 = it1.next();
T e2 = it2.next();
if( !e1.equals(e2)) return false;
}//while
return true;
}//equals
public int size(){
int k=0;
for (T e : this)
k++;
return k;
}//size
public String toString(){
StringBuilder sb=new StringBuilder(200);
sb.append('[');
Iterator<T> it=iterator();
while( it.hasNext() ){
sb.append( it.next() );
if( it.hasNext() ) sb.append(',');
}
sb.append(']');
return sb.toString();
}//toString
public int hashCode(){
int p=58;
int h=1;
for( T e: this )
h=h*p+e.hashCode();
return h;
}//hashCode
public void clear(){
Iterator<T> i=this.iterator();
while( i.hasNext() ) {
i.next();
i.remove();
}
}//clear
public boolean contains( T elem ){
for(T e: this){
if( e.equals(elem) ) return true;
if( e.compareTo(elem)>0 ) return false;
}
return false;
}//contains
public boolean isEmpty(){
return iterator().hasNext();
}//isEmpty
public boolean isFull(){
return false;
}//isFull
public void remove( T elem ){
Iterator<T> it=this.iterator();
while( it.hasNext() ){
T e=it.next();
if( e.equals( elem ) ){
it.remove();
break;
}
}
}//remove
}
e qui di seguito vi è la classe concreta della lista doppiamente concatenata, dove ho problemi con l'implementazione dell'iteratore:
codice:
package progetto1;
import java.util.*;
public class ListaConcatenata <T extends Comparable<? super T>> extends ListaAstratta<T>implements Iterable<T>{
private static class Nodo<E>{
E info;
Nodo next;
Nodo prior;
public Nodo(){
info = null;
next= null;
prior=null;
}
public E getInfo(){return info;}
public Nodo getNext(){return next;}
public Nodo getPrior(){return prior;}
public void setNext(Nodo node){next=node;}
public void setPrior(Nodo node){prior=node;}
public void setInfo(E argomento){info=argomento;}
}
private Nodo <T> first=null, last=null;
private int size=0;
public void sort(Comparator<T> c) {
if (isEmpty())throw new RuntimeException("ERRORE!-Lista vuota");
int a = size();
while (a!=0){
if (this.compareTo(c)>0)
}
}
public void add (T elem){
Nodo<T>nuovo= new Nodo<T>();
nuovo.info=elem;
if(first==null||first.info.compareTo(elem)>=0){
nuovo.next=first;
first=nuovo;
first.prior=null;
if(last == null)last=nuovo;
}
else
if(last.info.compareTo(elem)<=0){
nuovo.next=null; nuovo.prior=last; last.next=nuovo; last=nuovo;
}
else{
Nodo<T>cor= first.next;
while(cor!=null) {
if(cor.info.compareTo(elem)<0){
cor=cor.next;
nuovo.next=cor;
cor.prior.next=nuovo;
cor.prior=nuovo;
}
size++;
}
}
}//ADD
public ListIterator<T> listIterator(){
return null;
}//
public ListIterator<T> listIterator( int start ){return null;}//NO
public void addFirst( T elem ){}//no
public void addLast( T elem ){}//no
public T getFirst(){return null;}//no
public T getLast(){return null;}//no
public T removeFirst(){return null;}//no
public T removeLast(){return null;}//no
@Override
public Iterator<T> iterator() {
return iterator();
}
class Iteratore implements Iterator{
private Nodo<T> cor=null, pre=null, suc= first;
//cor o e' null o punta all'ultimo nodo GIA' visitato
public boolean hasNext(){
if( cor==null ){
return first!=null;
}
return cor.next!=null;
}//hasNext
public T next(){
if( !hasNext() )
throw new NoSuchElementException();
if( cor==null ) cor=first;
else{
pre=cor;
cor=cor.next;
suc=suc.next;
}
return cor.info;
}//next
public void remove(){
if( pre==cor )
throw new IllegalStateException();
if( cor==first ){
first=first.next;
if( first==null ) last=null;
}
else if( cor==last ){
last=pre;
last.next=null;
}
else{
pre.next=cor.next;
}
cor=pre; //arretra cor
}//remove
}//Iteratore */
}
Non ho capito questo maledetto iteratore come funziona
, se qualcuno può aiutarmi lo ringrazio di cuore