Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    86

    Java - problema iteratore

    Salve a tutti devo implementare l'iteratore per una lista linkata creata da me.
    Ho creato l'interfaccia dictionary<K,V> che estende Iterable <K> e la classe LinkedList<K,V> che implementa Dictionary<K,V>.
    Ora ho un problema : Come costruisco l'iteratore per la classe linkedList?
    grazie in anticipo


    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);
    }
    codice:
    public class LinkedList<K, V> implements Dictionary<K,V>{
    
        Record list = null;
        
        class Record<K,V> {
            K key;
            V value;
            Record successivo;
            Record precedente;
            
            Record(K key, V value){
                this.key = key;
                this.value = value;
            }
        }
        
        
        @Override
        public Iterator<K> iterator() {
            // TODO Auto-generated method stub
            return null;
        }
    
    
        @Override
        public void insert(K key, V value) {
            Record nuovo = new Record(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 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 p =list.successivo;;p=p.successivo){
                if(p.key.equals(key))
                    return (V) p.value;
                if(p==list)
                    return null;
            }
            
        }

  2. #2
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    http://docs.oracle.com/javase/6/docs.../Iterator.html

    devi creare una classe che implementa l'interfaccia iterator. Quindi i tre metodi elencati. E' piuttosto banale, io ci metterei due sole proprietà, una la tua linked list, e l'altra una variabile "puntatore" all'elemento corrente.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    86
    Quote Originariamente inviata da kuarl Visualizza il messaggio
    http://docs.oracle.com/javase/6/docs.../Iterator.html

    devi creare una classe che implementa l'interfaccia iterator. Quindi i tre metodi elencati. E' piuttosto banale, io ci metterei due sole proprietà, una la tua linked list, e l'altra una variabile "puntatore" all'elemento corrente.
    Grazie della risposta ! Ma mi sapresti dire in questo caso particolare tu come lo avresti fatto? Perché quello vorrei sapere

  4. #4
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    Quote Originariamente inviata da veilside Visualizza il messaggio
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    86
    Ti ringrazio , sei stato super gentile! Ho solo due domande (perdonami se possono sembrar niubbe ma vorrei avere le idee chiare)

    1)La classe Record l'avevo definita con class Record<K,V> tu invece : class Record<K1,V1> cambia qualcosa?

    2) cambia qualcosa tra l'implementazione del tuo iteratore e avere l'implementazione dell'iteratore in una classe a parte che viene richiamata dal metodo iterator() della classe linkedlist ?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da veilside Visualizza il messaggio
    1)La classe Record l'avevo definita con class Record<K,V> tu invece : class Record<K1,V1> cambia qualcosa?
    K/V/K1/V1 sono i nomi delle type variable, tecnicamente puoi mettere i nomi che vuoi. Tipicamente, in genere per "convenzione", si usano lettere singole. Basta che guardi il framework standard: K/V per chiave/valore, T per tipo in generale, E per elemento (delle collezioni).

    Quote Originariamente inviata da veilside Visualizza il messaggio
    2) cambia qualcosa tra l'implementazione del tuo iteratore e avere l'implementazione dell'iteratore in una classe a parte che viene richiamata dal metodo iterator() della classe linkedlist ?
    Generalmente l'iteratore deve poter accedere a dettagli interni della collezione, pertanto tipicamente è meglio definire la classe dell'iteratore in modo che sia interna alla collezione e oltretutto nascosta (non visibile dall'esterno). A chi usa l'iteratore non importa quale è la classe .... ma solo che è-un Iterator.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    86
    Perfetto è tutto chiaro adesso!
    grazie ragazzi!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Mi sono ricordato adesso che sul tutorial ufficiale di Java c'è una sezione che spiega le convenzioni sui parametri di tipo. Lo segnalo poiché utile:
    Generic Types nella sezione Type Parameter Naming Conventions
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.