Newsgroup: it.comp.java
Titolo: Alberi e nodi in Java

Devo valutare i nodi di un albero, e i relativi figli. Il mio
programma però mi dà un errore al momento dell'esecuzione. La parte di
codice incriminata è la seguente:
public int trovaCellaDelFiglioSx(int c) {
 
		// Il problema è alla riga seguente:
		int cellaDelFiglioSx =((Node)v.elementAt(c)).figlioSx;
		return cellaDelFiglioSx;
}
dove v è un vettore che all'interno delle celle ha le istanze
dell'oggetto Nodo (appartenente alla classe Node), mentre figlioSx è
una proprietà dell'oggetto Nodo (di tipo int). 
L'errore viene dato anche alla seguente chiamata del metodo:
cfs = Nodo.trovaCellaDelFiglioSx(contatore);
dove cfs è una variabile temporanea che mi serve per passare, al
metodo precedente, la cella del vettore dove risiede il figlio del
nodo.
Comunque il compilatore non mi dà errori, ma mi visualizza questo
messaggio all'esecuzione:
Exception in thread "main" java.lang.NullPointerException
	at Node.trovaCellaDelFiglioSx(Node.java:35)
	at Node.Evaluate(Node.java:107)
	at Node.main(Node.java:222)
Secondo voi dov'è l'errore? Qualcuno me lo sa dire? Grazie.
Miki

Exception in thread "main" java.lang.NullPointerException
Si avvalorano i miei dubbi :-)
-- 
Ciao
	Fabrizio C.

ho messo int perchè deve essere il numero che mi rappresenta la cella
del vettore dove risiede il figlio del nodo.
Come faccio a far vedere il vettore senza doverlo dichiarare (e
riempire) in ogni metodo? Il fatto che mi veda Null è perchè non
"vede" il vettore e quindi restituisce Null.
Ho già provato a dichiarare il vettore in un metodo e a richiamare il
metodo in altri metodi, ma così non funziona.
Devo trovare un modo per inizializzare il vettore senza ripetere il
codice un sacco di volte...
Miki


Forse mi sbaglio, ma secondo me dovresti rivedere i concetti di variabili
locali e globali....

codice un sacco di volte...
Le basi della programmazione ;-)
-- 
Ciao
	Fabrizio C.

Difficile capire senza vedere il codice...
Eccolo:
import java.util.*;
public class Node {
	String contenuto;
	String tipoNodo;
	String sito;
	boolean esecuzione;
	int figlioSx;
	int figlioDx;
	Vector v;
	String espressioneTemp;
 
	public Node() {
		contenuto = "";
		tipoNodo = "";
		figlioSx = 1;
		figlioDx = 0;
		esecuzione = true;
		sito = "";
	}
	public Node(String typeofnode, String content, int leftchild,
int rightchild,
				boolean execution, String site) {
 
		tipoNodo = typeofnode;
		contenuto = content;
		figlioSx = leftchild;
		figlioDx = rightchild;
		esecuzione = execution;
		sito = site;
	}
 
	public int trovaCellaDelFiglioSx(int c) {
 
		//Inizializzo il vettore
		Vector v = new Vector();
		Node Nodo;
		Nodo = new Node("unaryOp","Proiezione",1,0,true,"dw");
		v.addElement(Nodo);
		Nodo = new Node("union","Unione",2,6,false,"dw");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",3,4,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",5,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",7,9,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",8,0,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("minus","Meno",10,11,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabE",0,0,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,false,"e");
		v.addElement(Nodo);
 
		Nodo = (Node)v.elementAt(c);
 
		int cellaDelFiglioSx =
((Node)v.elementAt(c)).figlioSx;
		return cellaDelFiglioSx;
	}
 
	public int trovaCellaDelFiglioDx(int z) {
 
		//Inizializzo il vettore
		Vector v = new Vector();
		Node Nodo;
		Nodo = new Node("unaryOp","Proiezione",1,0,true,"dw");
		v.addElement(Nodo);
		Nodo = new Node("union","Unione",2,6,false,"dw");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",3,4,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",5,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",7,9,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",8,0,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("minus","Meno",10,11,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabE",0,0,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,false,"e");
		v.addElement(Nodo);
 
		Nodo = (Node)v.elementAt(z);
		int cellaDelFiglioDx =
((Node)v.elementAt(z)).figlioDx;
		return cellaDelFiglioDx;
	}
 
	public String trovaFiglio(int s) {
 
		//Inizializzo il vettore
		Vector v = new Vector();
		Node Nodo;
		Nodo = new Node("unaryOp","Proiezione",1,0,true,"dw");
		v.addElement(Nodo);
		Nodo = new Node("union","Unione",2,6,false,"dw");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",3,4,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",5,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",7,9,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",8,0,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("minus","Meno",10,11,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabE",0,0,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,false,"e");
		v.addElement(Nodo);
 
		Nodo = (Node)v.elementAt(s);
		String figlio = ((Node)v.elementAt(s)).tipoNodo;
		return figlio;
	}
 
	public String trovaSitoFiglio(int k) {
 
		//Inizializzo il vettore
		Vector v = new Vector();
		Node Nodo;
		Nodo = new Node("unaryOp","Proiezione",1,0,true,"dw");
		v.addElement(Nodo);
		Nodo = new Node("union","Unione",2,6,false,"dw");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",3,4,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",5,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",7,9,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",8,0,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("minus","Meno",10,11,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabE",0,0,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,false,"e");
		v.addElement(Nodo);
 
		Nodo = (Node)v.elementAt(k);
		String sitofiglio = ((Node)v.elementAt(k)).sito;
		return sitofiglio;
	}
 
	public String Evaluate(int contatore) {
 
		int nodo = 0;
		boolean esecuzionefiglio = true;
		String risultatosinistro ="";
		String risultatodestro = "";
		String contfigliosinistro = "";
		String contfigliodestro = "";
		String espressione = "";
		int cfs = 0;
		int cfd = 0;
		String fs = "";
		String fd = "";
		String sfs = "";
		String sfd = "";
 
		//Inizializzo il vettore 
		Vector v = new Vector();
		Node Nodo;
		Nodo = new Node("unaryOp","Proiezione",1,0,true,"dw");
		v.addElement(Nodo);
		Nodo = new Node("union","Unione",2,6,false,"dw");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",3,4,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",5,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("join","Join",7,9,true,"e");
		v.addElement(Nodo);
		Nodo = new Node("unaryOp","Selezione",8,0,true,"f");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaF",0,0,false,"f");
		v.addElement(Nodo);
		Nodo = new Node("minus","Meno",10,11,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabE",0,0,false,"e");
		v.addElement(Nodo);
		Nodo = new Node("leaf","TabDeltaE",0,0,false,"e");
		v.addElement(Nodo);
 
		//Estraggo il nodo 
		Nodo = (Node)v.elementAt(contatore);
 
		if (Nodo.tipoNodo.equals("leaf")) nodo = 1;
		else if (Nodo.tipoNodo.equals("join")) nodo = 3;
		else if	(Nodo.tipoNodo.equals("union")) nodo = 4;
		else if	(Nodo.tipoNodo.equals("minus")) nodo = 5;
		else if	(Nodo.tipoNodo.equals("unaryOp")) nodo = 2;
 
		//Verifico il contenuto del Nodo
		switch (nodo) {
		case 1: { //Aggiunge la foglia all'espressione se non
appartiene alle EmptyDeltaTables
				  if ( Nodo.contenuto.equals(""))
espressione = "";
				  else espressione = Nodo.contenuto;
 
				  //espressioneTemp =
(risultatosinistro + espressione);
 
				  break;}
		case 2: { cfs = Nodo.trovaCellaDelFiglioSx(contatore);
				  fs = Nodo.trovaFiglio(cfs);
				  sfs = Nodo.trovaSitoFiglio(cfs);
 
				  contatore++;
				  //Valuto il figlio sinistro
				  risultatosinistro =
Nodo.Evaluate(cfs);
				  //Concatena il risultato sinistro
all'espressione
				  if (risultatosinistro.equals(""))
espressione = "";
				  else espressione = (Nodo.contenuto +
" " + risultatosinistro);
				  break;}
		case 3: { cfs = Nodo.trovaCellaDelFiglioSx(contatore);
				  cfd =
Nodo.trovaCellaDelFiglioDx(contatore);
 
				  fs = Nodo.trovaFiglio(cfs);
				  fd = Nodo.trovaFiglio(cfd);
				  sfs = Nodo.trovaSitoFiglio(cfs);
				  sfd = Nodo.trovaSitoFiglio(cfd);
 
				  contatore++;
 
				  //Controlla se i figli hanno lo
stesso sito
				  if (sfs != sfd) esecuzionefiglio =
true;
				  else esecuzionefiglio = false;
				  //Concatena il risultato sinistro
all'espressione
				  risultatosinistro =
Nodo.Evaluate(cfs);
				  if (risultatosinistro.equals(""))
espressione = "";
				  else espressione =
(risultatosinistro + " " + Nodo.contenuto + " " + risultatodestro);
				  break;}
		case 4: { cfs = Nodo.trovaCellaDelFiglioSx(contatore);
				  cfd =
Nodo.trovaCellaDelFiglioDx(contatore);
 
				  fs = Nodo.trovaFiglio(cfs);
				  fd = Nodo.trovaFiglio(cfd);
 
				  sfs = Nodo.trovaSitoFiglio(cfs);
				  sfd = Nodo.trovaSitoFiglio(cfd);
 
			      contatore++;
 
			      //Controlla se i figli hanno lo stesso
sito
				  if (sfs != sfd) esecuzionefiglio =
true;
				  else esecuzionefiglio = false;
				  risultatosinistro =
Nodo.Evaluate(cfs);
				  risultatodestro =
Nodo.Evaluate(cfd);
				  espressione = (risultatosinistro + "
" + Nodo.contenuto + " " + risultatodestro);
				  break;}
		case 5: { cfs = Nodo.trovaCellaDelFiglioSx(contatore);
				  cfd =
Nodo.trovaCellaDelFiglioDx(contatore);
 
				  fs = Nodo.trovaFiglio(cfs);
				  fd = Nodo.trovaFiglio(cfd);
 
				  sfs = Nodo.trovaSitoFiglio(cfs);
				  sfd = Nodo.trovaSitoFiglio(cfd);
 
				  contatore++;
				  risultatosinistro =
Nodo.Evaluate(cfs);
				  risultatodestro =
Nodo.Evaluate(cfd);
				  espressione = (risultatosinistro + "
" + Nodo.contenuto + " " + risultatodestro);
				  esecuzione = false;
				  break;}
		}
		System.out.println("Espressione: " + espressione);
		return espressione;
	}
	public static void main(String args[]) {
		Node NodoIniziale = new Node();
		NodoIniziale.Evaluate(0);
	}
}

	public String Evaluate(int contatore) {
[CUT]
Credo di aver intuito cosa vuoi ottenere (ho visto anche gli altri 
post), ma mi perdonerai se ora non ho il tempo (e nemmeno tanta voglia 
:-) di guardare tutto il listato.
Prova a ristrutturare un po' il codice, nel frattempo magari ti viene 
qualche idea.
Hai tutto il mio appoggio... almeno morale ;-)
-- 
Ciao
	Fabrizio C.

 Hai tutto il mio appoggio... almeno morale ;-)
THANKS... PENSA CHE, SISTEMATA QUESTA RIDONDANZA, DEVO COSTRUIRE
L'APPLICAZIONE
ESATTAMENTE CONTRARIA: DEVO GENERARE UN ALBERO PARTENDO DA UNA QUERY.
NON SO IN CHE SINTASSI LA DEBBA INTERPRETARE, PERO' E' DURA UGUALE!!!
CIAO DA MIKI
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

NON SO IN CHE SINTASSI LA DEBBA INTERPRETARE, PERO' E' DURA UGUALE!!!
Coraggio.
Hai scritto altrove che devi passare da algebra relazionale a query 
SQL: per soddisfare una mia curiosità, posteresti una stringa di 
esempio di algebra relazionale (per vedere la notazione)?
Intendo proprio quella che dovresti dare in pasto al tuo programma :-)
-- 
Ciao
	Fabrizio C.

 Intendo proprio quella che dovresti dare in pasto al tuo programma :-)
Io non so attualmente come passare al programma la sintassi 
scritta in BAG ALGEBRA. Servono dei caratteri greci (Pi greca, la Sigma,
la Delta)
che non so come si facciano! 
Oddio, non è neanche un problema in quanto posso decidere io che 
sintassi dare in pasto al programma...
Voglio dire che potrei usare qualsiasi sintassi, tranne ovviamente 
quella SQL (che deve essere la sintassi restituita dal programma).
Il problema è che le query non hanno mica tanti modi per essere scritte!
Ci sono poche alternative. Una carina (ma aspetto anche un tuo
suggerimento)
potrebbe essere la costruzione di un form grafico che aiuti l'utente
a facilitare l'immissione di una query, mediante un pannello contenente
tutti i pulsanti (e quant'altro) che servono per dare al programma
che query stiamo immettendo. Ma non so mica se si può fare...tu che
dici?
Ciao,
Miki


Ma non so mica se si può fare...tu che dici?
Dico che (quasi) tutto si può fare, ma bisogna dare delle priorità.
Io farei prima qualcosa che funzioni bene (sperabilmente) in console 
(quindi stringhe in input ed in output). Mi occuperei solo in seguito 
del "come" l'utente dovrà costruire queste stringhe.
Tutto rigorosamente IMHO. ;-)
-- 
Ciao
	Fabrizio C.