Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63

    Lavorare su un vector di strutture

    Ciao a tutti,
    sono nuovo e muovo i miei primi passi su java, per questo vi chiedo scusa per eventuali "strafalcioni".

    Ho la necessità di creae un vettore di strutture di questo tipo:
    codice:
    public class Struttura {
    	String sezione;
    	String nomenodo;
    	String valore;
    	
    	
    	public Struttura(String section, String nodename, String value){
    		sezione=section;
    		nomenodo=nodename;
    		valore=value;
    	}
    }
    Utilizzo un metodo che estrae dei valori da un file xml e crea questo vector:
    codice:
    private Vector valoriammissibili (Node node, Vector valori) {
         		int type = node.getNodeType();
                if (type == Node.ELEMENT_NODE || type==Node.DOCUMENT_NODE){
                	NodeList nodes = node.getChildNodes();
                    if (nodes != null) {
                        for (int j=0; j<nodes.getLength(); j++) {
                        	valoriammissibili(nodes.item(j), valori);
                        }
                    }
                }
                else if (type==Node.CDATA_SECTION_NODE || type==Node.TEXT_NODE){
                	if (! node.getNodeValue().startsWith("\n") && ! node.getNodeValue().startsWith(" ")){
                		Struttura struct=new Struttura(node.getParentNode().getParentNode().getNodeName(), node.getParentNode().getNodeName(), node.getNodeValue());
                		valori.addElement(struct);
                	}
                }
                return valori;
            }
    Adesso la necessità che ho è quella di leggere i campi delle strutture memorizzate all'interno del vector. Ovvero andare a leggere cosa c'è in vector->elementAt(i)->sezione.
    Senza quest'accesso ai dati non so neanche se il codice che ho scritto è corretto xkè non riesco a leggere cosa è memorizzato nel vector!
    Qualcuno di voi sa aiutarmi?

    Grazie

    Fil

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    A parte la struttura che, secondo me, andrebbe rivista (passare un Vector come argomento e farselo ritornare non è proprio elegantissimo), il modo che hai per ottenere gli oggetti contenuti nel vector è usare il metodo elementAt():
    codice:
    ...
    mioVector = valoriAmmissibili(nodo, mioVector);
    
    for(int j=0; j<mioVector.size(); j++) {
       System.out.println("Oggetto " + j + ": " + ((Struttura) mioVector.elementAt(j)).sezione);
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63
    Ti ringrazio tanto Lele, non sai che rompicapo mi hai risolto!

    La scelta che ho fatto di passare il vector per poi farmelo ritornare modificato è dettata dalla ricorsione della funzione. E' il modo più immediato che mi è venuto in mente per aggirare l'ostacolo, ma forse non il migliore...

    Forse sono di troppe pretese, ma c'è un'altra cosa che proprio non capisco e che mi piacerebbe sottoporvi. La funzione:
    codice:
    private void confronta (Node node, Vector valori) {
        	switch (node.getNodeType()) {
            case Node.DOCUMENT_NODE:
            case Node.ELEMENT_NODE:
                // recurse on each child
                NodeList nodes = node.getChildNodes();
                if (nodes != null) {
                    for (int i=0; i<nodes.getLength(); i++) {
                        confronta(nodes.item(i), valori);
                    }
                }
                break;
    
            case Node.TEXT_NODE:
            case Node.CDATA_SECTION_NODE:
            	if (! node.getNodeValue().startsWith("\n") && ! node.getNodeValue().startsWith(" ")){
            		Struttura struct=new Struttura(node.getParentNode().getParentNode().getNodeName(), node.getParentNode().getNodeName(), node.getNodeValue());
            		System.out.println(valori.contains(struct));
            		
            	}
                
                break;
        	}
        	
        }
    confronta i valori contenuti in un documento xml verificando che siano ammissibili (ovvero che siano contenuti nel vector "valori" che abbiamo creato prima).
    Usando il metodo contains(Object) ottengo però sempre false. Ho commesso qualche errore nel codice o sbaglio ad usare la funzione?

    Grazie ancora.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Contains() prende tutti gli elementi del vettore ad uno ad uno e confronta i due elementi con il metodo equals(). Essendo una classe scritta da te, il metodo equals() e' quello ereditato dalla classe Object, che restituisce true se e solo se si confrontano due variabili che puntano alla stessa istanza dell'oggetto. Se sono due istanze diverse (come e' il tuo caso), resituisce false anche se le due istanze hanno le variabili settate con gli stessi valori.
    Se vuoi che si comporti nel modo in cui cercavi di usarlo tu, devi sovrascrivere il metodo equals().

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63
    Ragazzi, davvero non so come ringraziarvi per il preziosissimo aiuto che mi state dando!

    Ma ho un problemino che credo riguardi l'overriding. Infatti ho seguito il consiglio di simo ridefinendo il metodo equals() nella classe Struttura in questo modo:

    codice:
    public boolean equals(Struttura struttura){
    		boolean equals=false;
    		if (struttura.sezione==sezione && struttura.nomenodo==nomenodo && struttura.valore==valore)
    			equals=true;
    		return equals;
    	}
    Ma il funzionamento non è quello desiderato...
    Se infatti applico il metodo in questo modo:

    codice:
    Struttura strutt=new Struttura("prova1", "prova2", "prova3");
        	Struttura strutt2=new Struttura("prova1", "prova2", "prova3");
            System.out.println(strutt.equals(strutt2));
    funziona correttamente restituendo true.
    Ma se applico il metodo così:

    codice:
    Struttura strutt=new Struttura("prova1", "prova2", "prova3");
        	Struttura strutt2=new Struttura("prova1", "prova2", "prova3");
        	for (int i=0; i<valori.size(); i++){
    			System.out.println(strutt.equals(((Struttura) valori.elementAt(i))));
    		}
    Restituisce sempre false...

    Cosa sbaglio?

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    C'e' un elemento con le variabili settate a "prova1", "prova2", "prova3" dentro al tuo Vector. Per sicurezza, prova dentro il for a farti stampare per ogni elemento il valore delle 3 variabili. Almeno vediamo se dentro al vettore c'e' quello che ti aspetti.
    EDIT: aspe' non avevo notato una cosa. Le stringhe si confontano con stringa1.equals(stringa2).
    L'operatore == si puo' usare solo per i tipi di dato primitivi (char, int, boolean, eccetra).

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63
    Tombola!!

    Infatti funziona! Hai ragione, ma perchè poi usando le due trutture e confrontandole direttamente non dava problemi?
    Vi chiedo scusa per la "banalità" delle mie sviste, ma devo ancora farmi le ossa!

    Vi ringrazio ancora tanto per l'enorme aiuto!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    L'operatore confronto (==) restituisce true solo se le due variabili puntano alla stessa area di memoria. Se tu avessi passato hai metodi delle variabili tipo new String("prova1") ti avrebbe restituito false. Invece, passando direttamente il valore, java cosa fa: salva in tre aree di memoria le stringhe "prova1", "prova2" e "prova3" e passa queste variabili (le stesse) ad ambedue le strutture. L'operatore == vedendo che le variabili puntano alla stessa area di memoria, restituisce true.
    Spe' leggi qua che e' spiegato un po' meglio.
    http://forum.html.it/forum/showthrea...=&pagenumber=1
    In ogni caso usa sempre equals per il confronto, perche' se gli stessi valori arrivano da classi diversi e credo anche da metodi diversi puntano ad aree diverse di memoria.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63
    Tutto chiarissimo, grazie!

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.