Newsgroup: it.comp.java
Titolo: Modificare una stringa ricorsivamente

Salve a tutti, cerco con calma di spiegare il mio problema O_O
Ho implementato una classe Albero che implementa un albero N-ario
Poi per testarla in una classe di test ho costruito un albero molto 
semplice:
a
|_c
|_b
a è la radice, c è il primo figlio e b il secondo.
Nella classe albero ho implementato il metodo "toString()":
public String toString(){
		String s = "";
		stampa_previsita(radice, s);     //comincia dal nodo radice di questo 
albero
		return s;
	}
	private void stampa_previsita(Nodo u,  String s){
	1	s += 
u.info
 + " ";
	2	if(!foglia(u)){
	3		Nodo nt = primoFiglio(u);
	4		while(!fineFratelli(nt)){    //si ferma al penultimo fratello
	5			stampa_previsita(nt, s);
	6			nt = succFratello(nt);
			}
	7		stampa_previsita(nt, s);     //tratta l'ultimo fratello
		}
	}
Alla prima esecuzuine a riga 1 s = "a"
Alla seconda chiamata ricorsiva a riga 5 s = "a c" e poi torna a riga 6
Alla terza chiamata ricorsiva a riga 7 s = "a b" e poi esce
Al ritorno a toString s = ""
Quindi deduco che s viene passata per valore e non per riferimento.
Imfatti il metodo toString restituisce sempre la stringa vuota "".
Come posso fare in modo che s sia sempre la stessa stringa?
Spero sia riuscito a spiegare il problema
Grazie mille delle risposte;
 

Mi scuso se prima sono stato poco chiaro, la sostanza del problema e che io 
scrivo per es questo programma:
public static void main(String[] args) {
		String str = "Ciao";
		completastr(str);
		System.out.println(str); // qui mi aspetto la stampa di "Ciao Mondo!"
	}
	private static void completastr(String str1){
		str1 += " Mondo!";
	}
se lo eseguo invece mi stampa "Ciao", quindi str non viene aggiornata.
A questo punto str viene passata per valore e non viene modificata
Aiuto :-)
Come faccio a modificare str nell'altro metodo ?
(Forse adesso si capisce di piů.) 

 Come faccio a modificare str nell'altro metodo ?
Ciao, ci sono due problemi nel tuo codice. 
1) Il passaggio dei parametri in Java è SEMPRE per valore, per cui non riuscirai mai a modificare un riferimento internamente ad un metodo.
2) Le stringhe in Java sono immutabili; una volta create cioé non possono più essere modificate.  Ogni metodo che lavora su stringhe ti restituirà sempre un NUOVO oggetto stringa, non potendo modificare l'originale.
Una versione funzionante del tuo codice è questa:
        private String void completastr(String str1){
                return (str1 + " Mondo!");
        }
  System.out.println(completastr("ciao"));
pole
-- 
ammentos - a lightweight persistence framework for Java
http://ammentos.biobytes.it
 

         }
Penso che intendessi
private String completastr(String str1)


   {return (str1 + " Mondo!");}
LOL certamente grazie :)
ddpole


 Come faccio a modificare str nell'altro metodo ?
Prova ad usare uno StringBuffer!
Saluti
CarMas

Grazie, tenuto conto di quanto hai detto, ho risolto anche il problema del 
metodo ricorsivo che ho scritto nel primo post.
Cioč visto che modificare il parametro stringa č impossibile il metodo 
costruisce una nuova stringa il cui valore e la concatenazione del valore 
del parametro stringa e della nuova informazione da aggiungere e poi 
restituisce questa nuova stringa.
Per la serie la ricorsione č un casino.
                public String toString(){
		String s = "( ";
		s = stampa_previsita(radice(), s);
		return s += ")";
	}
	private String stampa_previsita(Nodo u, String s1){
		String s2 = s1 + 
u.info
 + " ";
		if(!foglia(u)){
			Nodo nt = primoFiglio(u);
			while(!fineFratelli(nt)){
				s2 = stampa_previsita(nt, s2);
				nt = succFratello(nt);
			}
			s2 = stampa_previsita(nt, s2);
		}
		return s2;
	}
 

 ha scritto nel messaggio 
news:4970a9aa$0$1129$4faf...@reader1.news.tin.it...

Non ci avevo pensato.
Un altro modo è anche quello di dichiarare la stringa come istanza della 
classe e modificarla di volta in volta, anche se non centra con le 
specifiche della struttura.
 

 1) Il passaggio dei parametri in Java � SEMPRE per valore, per cui non riuscirai mai a modificare un riferimento internamente ad un metodo.
Perdonami ma questa non la ho capita. Cosa intendi per "non riuscirai 
mai a modificare un riferimento internamente ad un metodo".
--
ac

 Come faccio a modificare str nell'altro metodo ?
usa StringBuffer. questo in generale, quando devi fare operazioni che 
modificano stringhe.
-- 
++ questo messaggio è scritto in forma ridotta per venire incontro alle 
vostre capacità mentali
http://unopuntozero.wordpress.com/
http://www.flickr.com/photos/marko_po/

 modificano stringhe.
oppure StringBuilder