Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [JAVA] Tokenizer

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118

    [JAVA] Tokenizer

    Ragazzi vi posto un codice, mi dite cosa nn quadra, a me nn va. Non da nessuna eccezione particolare, solo che nn fa quello che dovrebe fare.

    codice:
    public void createNode(String stringa) {
    				StringTokenizer tokenizza = new StringTokenizer(stringa);
    				String[] stringhetta = new String[tokenizza.countTokens()];
    				System.out.println(tokenizza.countTokens());
    				top = new DefaultMutableTreeNode("NetWork");
    				top.isRoot();
    				for (int i = 0; i == tokenizza.countTokens(); i++) {
    					stringhetta[i] = tokenizza.nextToken();
    				}
    				DefaultMutableTreeNode net = new DefaultMutableTreeNode(stringhetta[1]);
    				for (int j = 2; j == tokenizza.countTokens(); j++) {
    					DefaultMutableTreeNode servers = null;
    					servers = new DefaultMutableTreeNode(stringhetta[j]);
    					net.add(servers);
    				}
    				top.add(net);
    		}
    Su per giu' funziona così. Da un file letto con un bufferedreader, riga per riga, passo la stringa della riga letta a questo metodo (String stringa). Qui dovrebbe "tokenizzarmela", e in effetti lo fa, perchè quel System.out.println(tokenizza.countTokens()) funzia e mi scrive il numero di parole per ogni riga. Però appena passa ai cicli nn va, o meglio nn fa quello che dovrebbe fare, in quanto ho provato a togliere i cicli e a fare dei tree manuali e poi li vede (li richiamo da un'altra parte di codice). Quindi il problema è proprio del token. Aiutatemi!!!!! So già che la soluzione è piu' semplice di quello che mi sembra, però nn ci arrivo.
    Grazie a tutti.

    p.s. il secondo for inizia da 2 perchè mi serve di saltare le prime due parole (non c'è la possibilità che vada in nullpointer perchè ogni riga del file ha almeno 3 parole).

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Non è che hai scritto male la condizione di fermata dei for, cioè dovevi scrivere cosi:

    i < tokenizza.countTokens();
    j < tokenizza.countTokens();





  3. #3
    La condizione che hai imposto nei for è sbagliata. Perchè Il corpo del for viene eseguito solo se la condizione è verificata (cioè i == tokenizza.countTokens(). La tua condizione è verificata solo nel caso i token siano 0, in quel caso viene eseguita una sola iterazione.

    Di solito con lo StringTokenizer si usa
    codice:
    StringTokenizer st = new StringTokenizer(stringa);
    while(st.hasMoreToken()){
      //operazioni da eseguire
      ... tra queste operazioni deve esserci st.nextToken()
    }
    ..::200 post il 1 settembre 2004::..
    ..::100 13/07/2004::..
    ..): Web Site (pazienza però) ..
    VASCO castiga chi non lecca la FIGA

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118
    grazie mille, per la prima risposta beh sono io un deficiente che si dimentica certe cose, per la seconda proprio nn lo sapevo.
    Però ora ho un altro problema. Vi posto il nuovo codice.

    codice:
    public void createNode(String stringa) {
    				StringTokenizer tokenizza = new StringTokenizer(stringa);
    				DefaultMutableTreeNode[] nodo = new DefaultMutableTreeNode[tokenizza.countTokens()];
    				top = new DefaultMutableTreeNode("NetWork");
    				top.isRoot();
    				net = new DefaultMutableTreeNode (tokenizza.nextToken());
    				top.add(net);
    				while (tokenizza.hasMoreTokens()) {
    						net.add(new DefaultMutableTreeNode(tokenizza.nextToken()));
    				}
    								
    		}
    Il fatto è che a ogni nuova stringa che gli passa come riga letta dal bufferedreader, l'albero che si era appena creato viene "sovrascritto" con i dati della riga nuova.
    Il file che leggo ha la forma
    nome1 nome2 nome3 ...nome n
    Non sono tanti, ho fatto un file di prova con 3 righe, ma effettivamente l'albero visualizzato è solo quello con l'ultima riga. Consigli?

    grz

    p.s. l'albero da me creato deve essere in modo che nome1 di ogni riga sia figlio del ramo principale (top), mentre gli altri nome ..2 ..3 devono essere figli di nome1.

  5. #5
    Certo perchè le operazioni che fai all'interno del metodo istanziano un nuovo oggetto top. Se vuoi che ogni String che passi al metodo venga aggiunta ad un unico albero devi dichiarare quest'ultimo come variabile d'istanza ovvero fuori dal metodo (come avrai fatto in una parte del codice che non hai postato) e aggiungere i nodi sempre a questo.
    Inoltre net (dal codice che vedo) dovrebbe avere visibilità limitata al metodo createNode quindi non deve essere dichiarato fuori dal metodo.
    In pratica:

    codice:
    public void createNode(String stringa) {
    	StringTokenizer tokenizza = new StringTokenizer(stringa);
    	//NON SERVE + O SBAGLIO?!?
    	//DefaultMutableTreeNode[] nodo = new DefaultMutableTreeNode[tokenizza.countTokens()];
    	//questa riga è DA ELIMINARE
    	//top = new DefaultMutableTreeNode("NetWork");
    	//applica questo metodo fuori una volta per tutte
    	//top.isRoot();
    	DefaultMutableTreeNode net = new DefaultMutableTreeNode (tokenizza.nextToken());
    	top.add(net);
    	while (tokenizza.hasMoreTokens()) {
    		net.add(new DefaultMutableTreeNode(tokenizza.nextToken()));
    	}
    }
    ..::200 post il 1 settembre 2004::..
    ..::100 13/07/2004::..
    ..): Web Site (pazienza però) ..
    VASCO castiga chi non lecca la FIGA

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Credo che il problema dipenda dal fatto che ogni volta che chiami il metodo createNode() per inserire i nodi relativi a una stringa crei una nuova istanza di DefaultMutableTreeNode per top:

    top = new DefaultMutableTreeNode("NetWork");

    questa istruzione la dovresti eseguire una sola volta, prima di iniziare l'inserimento dei nodi con il metodo createNode(). Inoltre perke ti credi l'array nodo se poi non lo usi?


  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118
    grz mille ho risolto, l'array l'avevo creato prima di quest'ultima riscrittura del metodo per fare una prova e poi mi sn dimenticato di cancellare quella riga. LoL

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 © 2024 vBulletin Solutions, Inc. All rights reserved.