Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    lista che nn "funziona"

    ciao a tutti ragazzi.. ho questo problema (sul quale sto girando da 2 ore ma non ne vengo a capo..), sono sicuro che sia una stupidaggine.. ma non la riesco a cogliere!
    allora:
    ho una classe nodo:
    codice:
    class nodo{
    persona info;
    nodo link;
    }
    la classe persona ha 3 campi: cognome nome ed anno,
    e una clase lista, quando inserisco cognome nome ed anno di nascita mi crea la persona e ci associa i valori, poi richiama rubrica.add(); che e' questa:
    codice:
    public void add(persona nuova_persona){
            if(start==null){
                start=new nodo();
                start.info=nuova_persona;
                start.link=null;
            }
            else{
                nodo new_nodo=new nodo();
                new_nodo.info=nuova_persona;
                nodo attacco=check_posizione(nuova_persona);
                if(attacco==start){new_nodo.link=attacco.link;System.out.println("ATTACCO == START LINK => new_nodo.link=attacco.link");}
                else{new_nodo.link=attacco.link;}
                if(attacco==start){start=new_nodo;System.out.println("ATTACCO == START => attacco=new_nodo");}
                else{attacco=new_nodo;}
            }
        }
    la parte in grassetto e' questa funzione:
    codice:
        private nodo check_posizione(persona nuova){
            nodo precedente, successivo, posizione;
            precedente=start;
            successivo=start;
            posizione=start;
            if(check_cognome(nuova,start)<=0){posizione=start;return posizione;}
    else{
                precedente=successivo;
                successivo=start.link;
                while(successivo!=null && check_cognome(nuova,successivo)>0){
                    precedente=successivo;
                    successivo=successivo.link;
                }
                if(successivo==null){posizione=successivo;return posizione;}
                else if(check_cognome(nuova,successivo)<=0){posizione=precedente;return posizione;}
            }
            return posizione;
        }
    e' tutto abbastanza semplice, ma NON FUNZIONA!
    se ad esempio inserisco prima Rossi Mario 9999 e poi inserisco Bianco Marco 9999 quando vado a stampare tutta la lista mi stampa solo Bianco Marco, come se non funzionasse "attacco.link".... ma quando lo lancio i debug che ho messo per controllare funzionano..quindi l'associazione la fa', ma nn sembra.... qualcuno ha qualche idea?
    grazie in anticipo
    _angelotm

  2. #2
    scusatemi la funzione check_cognome e' un semplice compareTo, questa:
    codice:
         private int check_cognome(persona nuova, nodo successivo){
            return nuova.cognome.compareTo(successivo.info.cognome);
        }
    _angelotm

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    come istanzi persona?
    RTFM Read That F*** Manual!!!

  4. #4
    ciao, la classe persona e' proprio stupida..
    codice:
    public class persona {
    String cognome;
    String nome;
    int anno;
    public persona(){
        System.out.println("Inserire il cognome");
        this.cognome=input.get_string();
        System.out.println("Inserire il nome");
        this.nome=input.get_string();
        System.out.println("Inserire l'anno");
        this.anno=input.get_int();
    }
    }
    get_string etc sono dei semplici scanner
    e' assurdo dovrebbe essere tutto corretto!
    _angelotm

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    tu hai questa interfaccia

    codice:
    public void add(persona nuova_persona);
    come crei l'oggetto persona?
    non mi interessa al momento il costruttore, mi interessano i punti in cui inizializzi (cioè chiami il costruttore)

    che poi nel tuo costruttore non so cosa sia input, dal punto di vista programmazione ad oggetti con il costruttore (specie quello di default), non leggi da un elemento di I/O, ma assegni dei valori di default ai campi.
    Ho l'impressione che stai mescolando al bean i metodi di gestione del bean (che di solito ne sono esenti)
    RTFM Read That F*** Manual!!!

  6. #6
    ciao, non ti seguo molto con i termini che usi in realta' :P
    ma credo di aver capito che volevi sapere come creo la persona, ecco qui:
    codice:
            persona nuova=new persona();
            rubrica.add(nuova);
    comunque per farti capire il problema, se in add() dico che se la lista non e' vuota, ogni elemento seguente lo metto all'inizio o alla fine, il programma funziona! il problema e' nel check_posizione() o nell'assegnamento dopo che mi restituisce la posizione in cui deve stare la nuova persona!
    _angelotm

  7. #7
    Originariamente inviato da valia
    Ho l'impressione che stai mescolando al bean i metodi di gestione del bean (che di solito ne sono esenti)
    scusami ma mi potresti spiegare cosa vuol dire?
    cmq il fatto che nel costruttore non assegno valori di dafault e' per fare prima, cosi' quando lancio il programma per fare il debug faccio subito
    _angelotm

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da angelotm
    scusami ma mi potresti spiegare cosa vuol dire?
    Vuol dire una cosa molto semplice (te lo direbbe valia allo stesso modo).
    Che una classe come persona che "modella" appunto una persona, dovrebbe essere fatta come un semplice "bean", cioè una classe che ha i campi private per le proprietà e principalmente i metodi getter/setter (getNome(), setNome() ecc...) più altro che può servire essendo comunque un Object (tipicamente toString(), equals(), hashCode() ). Eventualmente anche un costruttore/i per inizializzare già subito i campi.

    Ma senza avere alcuna funzionalità di I/O verso l'utente, che invece dovrebbe essere delegata ad un altro punto del programma.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da andbin
    Vuol dire una cosa molto semplice (te lo direbbe valia allo stesso modo).
    Che una classe come persona che "modella" appunto una persona, dovrebbe essere fatta come un semplice "bean", cioè una classe che ha i campi private per le proprietà e principalmente i metodi getter/setter (getNome(), setNome() ecc...) più altro che può servire essendo comunque un Object (tipicamente toString(), equals(), hashCode() ). Eventualmente anche un costruttore/i per inizializzare già subito i campi.

    Ma senza avere alcuna funzionalità di I/O verso l'utente, che invece dovrebbe essere delegata ad un altro punto del programma.
    non avrei potuto dirlo meglio

    La mia prima impressione era che nel momento in cui crei l'oggetto usi la stessa istanza, quindi in realtà alla fine ne aggiungi uno solo.

    Mi chiedo adesso, come fai la stampa?
    RTFM Read That F*** Manual!!!

  10. #10
    Originariamente inviato da andbin
    Vuol dire una cosa molto semplice (te lo direbbe valia allo stesso modo).
    Che una classe come persona che "modella" appunto una persona, dovrebbe essere fatta come un semplice "bean", cioè una classe che ha i campi private per le proprietà e principalmente i metodi getter/setter (getNome(), setNome() ecc...) più altro che può servire essendo comunque un Object (tipicamente toString(), equals(), hashCode() ). Eventualmente anche un costruttore/i per inizializzare già subito i campi.

    Ma senza avere alcuna funzionalità di I/O verso l'utente, che invece dovrebbe essere delegata ad un altro punto del programma.
    Originariamente inviato da valia
    non avrei potuto dirlo meglio

    La mia prima impressione era che nel momento in cui crei l'oggetto usi la stessa istanza, quindi in realtà alla fine ne aggiungi uno solo.

    Mi chiedo adesso, come fai la stampa?
    grazie mille per le informazioni
    avete ragione sulla questione di lasciare l'input/output ad altre funzioni della classe delegate appositamente, ma come ho scritto sopra ho fatto in questo modo per risparmiare tempo , in che modo risparmio tempo vi chiederete voi, beh semplicemente ora che ho risolto vado a rifinire la classe anzi ora creo funzioni per rimuovere e cercare elementi, poi alla fine creo le funzioni di input e output! comunque non voglio farvi un testone di cosse inutili, grazie mille ancora per le risposte,
    vorrei solo farvi ancora 2 domande se possibile (approfitto della vostra disponibilita'^^)
    - cercando in giro ho letto di JList, LinkedList, HashMap o qualcosa del genere, e volevo chiedervi l'utilita' delle stesse rispetto alla mia lista (o dispendio di memoria fra loro e rispetto alla mia), sto approcciando da pochi giorni a java e prima di sperimentare le "cose gia' fatte" ho preferito crearmi la mia bella lista da solo
    -inoltre (non odiatemi se sono un niubbetto ancora..) volevo avere delle delucidazioni sull'esistenza o meno dei puntatori in java, e sull'utilita' del suffisso "static" che a quanto ho capito specifica che tale variabile o funzione appartiene alla classe stessa, sbaglio?

    grazie ancora!
    p.s. per chi ne ha bisogno, ecco come ho risolto il mio problema: praticamente quando passavo "start" con check_posizione, lo passavo sia se bisognava aggiungere al 1° che al 2° posto, quindi aggiungeva sempre dopo il primo elemento!
    eccovi la soluzione:
    codice:
            private nodo check_posizione(persona nuova){
            nodo precedente, successivo, posizione;
            precedente=start;
            successivo=start;
            posizione=start;
            if(check_cognome(nuova,start)<=0){posizione=null;return posizione;}
            else{
                precedente=successivo;
                successivo=start.link;
                while(successivo!=null && check_cognome(nuova,successivo)>0){
                    precedente=successivo;
                    successivo=successivo.link;
                }
                if(successivo==null){posizione=precedente;return posizione;}
                else if(check_cognome(nuova,successivo)<=0){posizione=precedente;return posizione;}
            }
            return posizione;
    }
    
    
        public void add(persona nuova_persona){
            if(start==null){
                start=new nodo();
                start.info=nuova_persona;
                start.link=null;
            }
            else{
                nodo precedente=check_posizione(nuova_persona);
                nodo new_nodo=new nodo();
                new_nodo.info=nuova_persona;
                if(precedente==null){
                new_nodo.link=start;
                start=new_nodo;
                }
                else{
                new_nodo.link=precedente.link;
                precedente.link=new_nodo;
                }
                this.print();
           }
      }
    _angelotm

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.