innanzitutto spero di aver azzeccato il titolo della discussione
volevo sapere se qualcuno di voi riesce ad aiutarmi a trasformare questa funzione in ricorsiva:
le funzioni check_nome() e check_cognome() se ve lo state chiedendo restituiscono un intero che determina se il cognome viene prima o dopocodice: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 if(check_cognome(nuova,start)==0){ if(check_nome(nuova,start)<=0){posizione=null;return posizione;} else{ successivo=start.link; while(successivo!=null && check_cognome(nuova,successivo)==0){ if(check_nome(nuova,successivo)<=0){posizione=precedente;return posizione;} else{precedente=successivo;successivo=successivo.link;} } if(successivo==null || check_cognome(nuova,successivo)!=0){posizione=precedente;return posizione;} } } else{ precedente=successivo; successivo=start.link; while(successivo!=null && check_cognome(nuova,successivo)>0){ precedente=successivo; successivo=successivo.link; } if(successivo==null || check_cognome(nuova,successivo)<0){posizione=precedente;return posizione;} else if(check_cognome(nuova,successivo)==0){ if(check_nome(nuova,successivo)<=0){posizione=precedente;return posizione;} else{ precedente=successivo; successivo=successivo.link; while(successivo!=null && check_cognome(nuova,successivo)==0){ if(check_nome(nuova,successivo)<=0){posizione=precedente;return posizione;} else{precedente=successivo;successivo=successivo.link;} } if(successivo==null || check_cognome(nuova,successivo)!=0){posizione=precedente;return posizione;} else{posizione=precedente;return posizione;} } } } return posizione; }
ecco ora se leggete la funzione check_posizione() vi rendete conto che controlla il cognome, e in base al cognome (se e' uguale) controlla il nome.codice:private int check_nome(persona nuova, nodo successivo){ return nuova.nome.compareTo(successivo.info.nome); } private int check_cognome(persona nuova, nodo successivo){ return nuova.cognome.compareTo(successivo.info.cognome); }
ora, considerando che la funzione e' gia' bella lunghetta solo controllando per cognome e nome, dovrei controllare anche per anno e per altri dati, potrei continuare a implementare condinzioni ma voglio ridimensionare il tutto rendendola ricorsiva, tipo check_posizione(dato) dove dato e' il campo da controllare (cognome, nome, anno, etc)
in modo che ad esempio quando il cognome risulta uguale io faccia una cosa del genere:
if(check_cognome(nuova,successivo)==0){check_posiz ione(nome);}
qualcuno di voi ha qualche idea?
perche' non riesco a venirne fuori sinceramente!
se avete altre soluzioni o consigli sul codice e' tutto ben accetto
grazie, angelo
EDIT: in realta' ci ho gia' provato, ma non riesco a passare come parametro alla funzione una sorta di "stringa" del tipo:
la parte in rosso, ovviamente, e' sbagliata perche' cerca un campo successivo.info.dato che non esiste (non avendo dichiarato String dato), dato dovrebbe solo servire per scegliere quale campo controllare!!codice:private nodo check_posizione(persona nuova){ ... if(check(nuova,start,nome) oppure if(check(nuova,start,cognome) } private int check(persona nuova, nodo successivo, String dato){ return nuova.nome.compareTo(successivo.info.dato); }



Rispondi quotando