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 č:
Classe Nodo del grafo: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 LinkedList, che implementerą l'albero: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 coppia: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 Albero che implementa l'interfaccia: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;} }
E il main: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; } }
Gli errori sono: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"); } }
Nel toString di BSTree..all'istruzionecodice: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
Non capisco perchč...codice:while(max.hasRight())

Rispondi quotando