Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Problema con la StringTokenizer..

    Devo leggere un file di input di questo tipo:

    codice:
    (1,3)
    (4,5) 
    (2,5)
    (5,1)
    (3,2)
    (2,1)
    (1,1)
    (5,5)
    (6,5)
    Cioč dalla stringa io converto in intero i due numeri che compaiono per ogni riga scartando le parentesi e la virgola, ma mi vengono dati errori, come se si volesse convertire anche lo spazio, cioč " " che tra l'altro visto che non c'č non capisco dove lo trova...
    Non capisco che cosa non vada...questo č il codice:

    codice:
    import java.io.*;
    import java.util.*;
    
    public class Main
    {
    	FileReader reader=null;
    	StringTokenizer str;
    	PrintWriter out=null;
    	BufferedReader buff=null;
    	
    	public void Costruiscialbero(String input, String output)
    	{
    		try{
    			reader=new FileReader(input);
    			buff=new BufferedReader(reader);
    			out=new PrintWriter(output);
    			
    			BSTree<TNode> albero=new BSTree<TNode>();
    			
    			while(buff.ready())
    			{
    				str=new StringTokenizer(buff.readLine(),"(,)");
    				
    				int primo=0;
    				int secondo=0;
    				
    				while(str.hasMoreElements())
    				{
    					primo=(Integer.parseInt(str.nextToken()));
    					secondo=(Integer.parseInt(str.nextToken()));
    				}
    				
    				Coppia coppia=new Coppia(primo, secondo);
    				TNode<Coppia> nodo=new TNode<Coppia>(coppia);
    				
    				albero.insert(nodo);
    				
    			}
    		      }
    			
    			catch(FileNotFoundException e1)
    			{
    				System.out.println("Error...file not found");
    			}
    		
    			catch(IOException e2)
    			{
    				System.out.println("Error...input/output");
    			}
    			
    			finally{
    				try{
    					
    					buff.close();
    					reader.close();
    					out.close();
    				      }
    				      
    				      catch(IOException e3){
    					      System.out.println("Error...it is not possible to close files");
    				      }
    			      }
    	}
    	
    	public static void main(String [] args)
    	{
    		Main main=new Main();
    		long start=System.currentTimeMillis();
    		main.Costruiscialbero("input.txt", "output.txt");
    		long end=System.currentTimeMillis();
    		System.out.println("Il tempo d'esecuzione č "+(end-start)+" ns");
    	}
    }
    E questi gli errori:

    codice:
    Exception in thread "main" java.lang.NumberFormatException: For input string: " "
    	at java.lang.NumberFormatException.forInputString(Unknown Source)
    	at java.lang.Integer.parseInt(Unknown Source)
    	at java.lang.Integer.parseInt(Unknown Source)
    	at Main.Costruiscialbero(Main.java:29)
    	at Main.main(Main.java:69)

  2. #2
    Prova a modificare il codice da cosģ:

    codice:
    ...
    str=new StringTokenizer(buff.readLine(),"(,)");
    ...
    a cosģ:

    codice:
    ...
    str=new StringTokenizer(buff.readLine().trim(),"(,)");
    ...
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Ah ok, ora funziona la lettura, con il metodo trim() della classe String allora elimino gli spazi, buono a sapersi.
    Perņ il programma non funziona....mi dą sempre nullpointerException, non gli vanno bene gli inserimenti, provo a ricontrollarlo, eventualmente, potresti dirmi se riesci a riscontrare dove sono gli errori?
    Praticamente ho un' interfaccia, e devo implementarla tramite una classe di tipo albero binario, il quale č costituito da nodi, contententi oggetti di tipo Coppia, formati da due interi.
    Il codice č:

    L'interfaccia č:
    codice:
    public interface IterativeBST<E> {
    public int size ();
    // ritorna il numero di nodi dell'albero
    public void insert (E x);
    // inserisce un nuovo elemento nell'albero
    public boolean search (E x);
    // ritorna true se l'elemento E č contenuto nell'albero
    public void RightRotate(E x);
    // effettua una rotazione destra sul nodo che contiene x
    public E succesor(E x);
    // ritorna l'elemento successivo di x
    }
    Classe Nodo del grafo:

    codice:
    public class TNode<E /*extends Comparable*/>
    {
    	private E element;
    	private TNode<E> parent, left, right;
    	
    	public TNode(E element)
    	{
    		this.element=element;
    		parent=null;
    		left=null;
    		right=null;
    	}
    	
    	//public void setElement(E element){this.element=element;}
    	
    	public E getElement(){return element;}
    	
    	public void setParent(TNode<E> parent){this.parent=parent;}
    	
    	public TNode<E> getParent(){return parent;}
    	
    	public void setLeft(TNode<E> left){this.left=left;}
    	
    	public TNode<E> getLeft(){return left;}
    	
    	public void setRight(TNode<E> right){this.right=right;}
    	
    	public TNode<E> getRight(){return right;}
    	
    	public boolean hasLeft(){return left!=null;}
    	
    	public boolean hasRight(){return right!=null;}
    	
    }
    classe LinkedList, che implementerą l'albero:

    codice:
    public class TLinkedList<E>
    {
    	private TNode<E> head, tail;
    	private int size;
    
    	public TLinkedList()
    	{
    		head=tail=null;
    		size=0;
    	}
    	
    	public int getSize(){return size;}
    	
    	public TNode<E> getHead(){return head;}
    	
    	public TNode<E> getTail(){return tail;}
    	
    	public void addNode(TNode<E> node){ //inserisco confrontando le coppie, una coppia č maggiore di un' altra se la somma dei due interi č maggiore di quella dell'altra coppia, e non posso essere mai uguali
    		if(size==0){
    			head=node;
    			tail=head;
    		}
    		else {
    			boolean inserito=false;
    			TNode<E> current=head;
    			
    			while(!inserito)
    			{
    				if(((Coppia)current.getElement()).compareTo(((Coppia)node.getElement()))<0)
    				{
    					if(!(current.hasRight()))
    					{
    						current.setRight(node);
    						node.setParent(current);
    						inserito=true;
    					}
    			
    					else current=current.getRight();
    				}
    				
    				else if(((Coppia)current.getElement()).compareTo(((Coppia)node.getElement()))>0)
    				{
    					if(!(current.hasLeft()))
    					{
    						current.setLeft(node);
    						node.setParent(current);
    						inserito=true;
    					}
    				}
    				
    				else current=current.getLeft();
    			}
    		}
    	}
    }
    Classe coppia:

    codice:
    public class Coppia<E>
    {
    	int primo, secondo;
    	
    	public Coppia(int primo, int secondo)
    	{
    		this.primo=primo;
    		this.secondo=secondo;
    	}
    	
    	public int compareTo(Coppia<E> coppia){ //le coppie non sono mai uguali
    		int somma1=getPrimo()+getSecondo();
    		int somma2=coppia.getPrimo()+coppia.getSecondo();
    		
    		if(somma1<somma2) return -1;
    		
    		else return 1;
    	}
    	
    	public int getPrimo(){return primo;}
    	
    	public int getSecondo(){return secondo;}
    }
    Classe Albero che implementa l'interfaccia:

    codice:
    public class BSTree<E>  implements  IterativeBST<E>
    {
    	private TLinkedList<TNode<E>> albero;
    	private int size;
    	private TNode<E> root;
    	
    	public BSTree()
    	{
    		root=null;
    		size=0;
    		albero=new TLinkedList();
    	}
    		
    	public int size(){return size;}
    	
    	public TNode<E> getRoot(){return root;}
    	
    	public void insert(E node){
    		((TLinkedList)albero).addNode((TNode)node);
    		size++;
    	}
    	
    	public boolean search (E node){
    		TNode<E> current=getRoot();
    		boolean trovato=false;
    		
    		while(!trovato && current!=null)
    		{
    			if(current.equals((TNode)node)){
    				trovato=true;}
    			
    			else if(((Coppia)current.getElement()).compareTo(((Coppia)((TNode)node).getElement()))<0){
    				current=current.getRight();}
    				
    			else current=current.getLeft();
    		}
    		
    		return trovato;
    	}
    	
    	public void RightRotate(E node){
    		if(node==null) return;
    		if(((TNode)node).getLeft()==null) return;
    		
    		TNode<E> y=((TNode)node).getLeft();
    		y.setParent(((TNode)node).getParent());
    	}
    	
    	public E succesor(E node){
    		TNode<E> toReturn=((TNode)node).getRight();
    		return (E)toReturn;
    	}
    	
    	public String toString(){
    		String s="";
    		TNode<E> max=getRoot();
    		while(max.hasRight())
    			max=max.getRight();
    		
    		s+=max.getRight();
    		
    		return s;
    	
    	}
    }
    E il main:

    codice:
    import java.io.*;
    import java.util.*;
    
    public class Main
    {
    	FileReader reader=null;
    	StringTokenizer str;
    	PrintWriter out=null;
    	BufferedReader buff=null;
    	
    	public void Costruiscialbero(String input, String output)
    	{
    		try{
    			reader=new FileReader(input);
    			buff=new BufferedReader(reader);
    			out=new PrintWriter(output);
    			
    			BSTree<TNode> albero=new BSTree<TNode>();
    			
    			while(buff.ready())
    			{
    				//str=new StringTokenizer(buff.readLine(),"(,)");
    				str=new StringTokenizer(buff.readLine().trim(),"(,)");
    
    				
    				int primo=0;
    				int secondo=0;
    				
    				while(str.hasMoreElements())
    				{
    					primo=(Integer.parseInt(str.nextToken()));
    					secondo=(Integer.parseInt(str.nextToken()));
    				}
    				
    				Coppia coppia=new Coppia(primo, secondo);
    				TNode<Coppia> nodo=new TNode<Coppia>(coppia);
    				
    				albero.insert(nodo);
    				
    			}
    			
    			albero.toString();
    		      }
    			
    			catch(FileNotFoundException e1)
    			{
    				System.out.println("Error...file not found");
    			}
    		
    			catch(IOException e2)
    			{
    				System.out.println("Error...input/output");
    			}
    			
    			finally{
    				try{
    					
    					buff.close();
    					reader.close();
    					out.close();
    				      }
    				      
    				      catch(IOException e3){
    					      System.out.println("Error...it is not possible to close files");
    				      }
    			      }
    	}
    	
    	public static void main(String [] args)
    	{
    		Main main=new Main();
    		long start=System.currentTimeMillis();
    		main.Costruiscialbero("input.txt", "output.txt");
    		long end=System.currentTimeMillis();
    		System.out.println("Il tempo d'esecuzione č "+(end-start)+" ns");
    	}
    }
    Gli errori sono:

    codice:
    Exception in thread "main" java.lang.NullPointerException
    	at BSTree.toString(BSTree.java:57)
    	at Main.Costruiscialbero(Main.java:42)
    	at Main.main(Main.java:73)
    >Exit code: 1
    Nel toString di BSTree..all'istruzione

    codice:
    while(max.hasRight())
    Non capisco perchč...

  4. #4
    E' perchč l'attributo max č null. Nella riga precedente lo valorizzi utilizzando il metodo getRoot() che restituisce l'attributo root. Purtroppo tale attributo vale sempre null in quanto non possiede alcun setter corrispondente del tipo setRoot(...) e nel costruttore della classe BSTree viene semplicemente inizializzato a null.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Ah...non ci avevo pensato, quindi per esempio ho aggiunto un metodo:

    codice:
    public void setRoot(TNode<E> nodo){root=nodo;}
    A parte questo l'errore si presenta sempre, ma non capiasco come mai, se l'inserimento nell'albero lo faccio tramite il metodo addNode della linkedlist, che gestisce tutto tramite head e tail, come puņ essere che continui ad avere sempre nullpointer exception?
    C'č qualche altra inizializzazione che non so fare?
    Mi faresti capire secondo te cos'altro manca nell'inserimento dei nodi o cosa causa il nullpointerexception?
    E' una giornata che non riesco a capire cosa non inizializzo o faccio bene.
    Intanto ho creato il metodo setRoot().

  6. #6
    Non ti basta aggiungere un metodo setXxx() perchč l'attributo associato venga inizializzato. E' necessario invocare tale metodo da qualche parte.
    L'alternativa č quella di scrivere un costruttore per la classe BSTree che preveda come parametro un oggetto di tipo TNode. In tal modo puoi inizializzare l'attrivuto root in fase di costruzione dell'oggetto.

    codice:
    ...
    	public BSTree(TNode<E> node) {
    		root = node;
    		...
    	}
    ...
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Ah....io siccome in genere nelle liste per esempio si inizializzano head e tail a null avevo pensato di fare la stessa cosa nell'albero con la radice....non si puņ fare diversamente?
    Cioč a quanto ho capito o inizializzo nel costruttore la radice, oppure se voglio inizializzarla a null devo implementare opportunamente il metodo di inserimento nell'albero controllando se l'albero č vuoto, e settando la root.
    Giusto?

  8. #8
    Ciao...anch'io ho svolto questo esercizio ed il tuo mi sembra un tantino errato. Non si tratta di un grafo ma di un semplice albero binario di ricerca. Il Prof ha fatto un errore nel testo....quindi la classe LinkedList gią mi sembra inutile. Purtroppo la right rotate non č cosģ semplice come la scrivi tu, stessa cosa per l'inserimento e il successore.
    A meno che tu per comoditą non implementi gli alberi con le liste. Io su suggerimento del Prof l'ho svolto diversamente.

  9. #9
    Ciao Sicula e grazie.
    Si, mi č stato detto, la linkedlist č inutile, ma allora l'albero o ha direttamente i nodi che puntano ai figli, oppure si sceglie di implementarlo con un array?
    Cioč noi come lo abbiamo implementato?
    O solamente con i nodi che puntanto a parent left e right(come ho deciso di fare infatti ho cambiato il codice) oppure con gli array?
    Per quanto riguarda i grafi, giusto per capire, in un esercizio dove c'era un grafo con lista di adiacenza io avevo implementato due liste appositamente, poi ho visto che il prof non ha assolutamente creato nč usato una classe lista. Ma allora perchč abbiamo visto l'implementazione tramite lista di adiacenza se poi non l'ha usata?
    Come si implementano?
    A parte queste domande, nel codice, io non so come si faccia la rightrotate, ho copiato il codice dal quaderno, non č che potresti darmi tu la rightotate? E magari se lo sai un esempio di leftrotate?
    Per quanto riguarda il metodo successor, come mai non va?
    Io dovrei restituire il successivo di un nodo preso come parametro, quindi il successivo io immagino sia quello pił grande, subito dopo, essendo un albero binario allora dovrei restituire il figlio destro. Come mai non va?

  10. #10
    Dareios al momento sono di premura perchč oggi sono tutto il giorno fuori per un lavoro fotografico. Ma stasera appena torno rispondo a tutti i tuoi dubbi, compreso di codice:-)
    a piu tardi

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.