Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Problema interfaccia Comparable...aiuto!!!

    Avrei un disperato bisogno che qualcuno mi spieghi come sistemare un problema, ho un esercizio:

    codice:
    Si fornisca un'efficiente implementazione dell'interfaccia
    BSTSet270710<E>, come mostrata nella pagina successiva.
    La classe rappresenta un insieme ordinato i cui elementi sono
    semplici alberi binari di ricerca (classe BST<E>).
    Ogni albero binario di ricerca dell'insieme č rappresentato
    dal suo elemento pił grande. L'insieme conterrą al massimo
    100 elementi. Gli elementi dell'insieme dovranno essere
    ordinati in base al loro rappresentante.
    L'implementazione del metodo iterator() č facoltativo, cosģ
    come la gestione delle eccezioni all'interno delle classi (Se
    il metodo iterator() non viene implementato il corpo dovrą
    contenere solo l'istruzione “return null”).
    Realizzare in seguito, mediante il metodo main() della
    classe, un programma Java che prenda in input un file di
    testo contenente le specifiche di alcuni alberi binari di
    ricerca (contenenti valori interi) e restituisca in output un
    file di testo contenente alcune caratteristiche dell'insieme
    dopo aver applicato 5 operazioni extractMax().
    
    Il file di input contiene una serie di righe terminanti con
    una carattere punto e virgola “;”. Ciascuna riga contiene la
    sequenza dei valori interi da inserire in ciascun albero
    dell'insieme. I valori interi sono forniti in ordine di
    inserimento nell'albero.
    File di output
    La prima riga del file di output contiene due valori interi
    separati da uno spazio. Il primo valore rappresenta il numero
    di valori interi dell'insieme, mentre il secondo valore
    rappresenta il numero di alberi. La seconda riga del file
    contiene l'elemento (Integer) pił grande dell'insieme.
    Ora, riporto il codice, vorrei che qualcuno mi chiarisse come evitare i problemi con l'interfaccia Comparable.
    Nella classe BST<E> nel metodo addNodo(...) ho problemi la prima volta che uso il compareTo perchč non viene trovato. Ho provato a modificare qualcosa ma non va bene, potreste dirmi cosa fare per fare implementare correttamente la Comparable?

    Riporto il codice e il relativo errore:

    codice:
    import java.util.*;
    interface BSTSet270710<E> /*extends Iterable<BST<E>>*/{
    public int items ();
    // ritorna il numero di items (di tipo E) dell'insieme
    public int size ();
    // ritorna il numero di elementi (di tipo BST<E>) dell'insieme
    public E getMax (int i);
    // ritorna il rappresentante dell'albero di posizione i
    public BST<E> getBST (int i);
    // ritorna l'albero di posizione i
    public void add (BST<E> tree);
    // aggiunge un nuovo albero all'insieme
    public void addItem (E item, int i);
    // aggiunge un nuovo item all'albero di posizione i
    public BST<E> search(E item);
    // ritorna il primo albero dell'insieme contenente l'item E
    public Iterator<BST<E>> iterator();
    // ritorna un iteratore di tutti gli alberi dell'insieme
    public E extractMax();
    // elimina e ritorna l'item pił grande dell'insieme
    }
    
    class BSTNode<E>
    {
    	private E element;
    	private BSTNode<E> left;
    	private BSTNode<E> right;
    	private BSTNode<E> parent;
    	
    	public BSTNode(E element)
    	{
    		this.element=element;
    		left=null;
    		right=null;
    		parent=null;
    	}
    	
    	public void setParent(BSTNode<E> parent){this.parent=parent;}
    	public BSTNode<E> getParent(){return parent;}
    	public E getElement(){return element;}
    	public BSTNode<E> getLeft(){return left;}
    	public void setLeft(BSTNode<E> left){this.left=left;}
    	public BSTNode<E> getRight(){return right;}
    	public void setRight(BSTNode<E> right){this.right=right;}
    	public boolean hasLeft(){return left!=null;}
    	public boolean hasRight(){return right!=null;}
    }
    
    class BST<E>
    {
    	private BSTNode<E> root;
    	private int nodes;
    	private final int CAPACITY;
    	
    	public BST(int CAPACITY)
    	{
    		this.CAPACITY=CAPACITY;
    		root=null;
    		nodes=0;
    	}
    	
    	public BSTNode<E> getRoot(){return root;}
    	public void setRoot(BSTNode<E> root){this.root=root;}
    	public int nodes(){return nodes;}
    	
    	public void addNodo(BSTNode<E> nodo)
    	{
    		if(nodes==0)
    			setRoot(nodo);
    		
    		else if(nodes<CAPACITY){
    			boolean inserito=false;
    			
    			BSTNode<E> tmp=getRoot();
    			
    			while(!inserito){
    				if(tmp.getElement().compareTo(nodo.getElement())<0)
    				{
    					if(!(tmp.hasRight())){
    						tmp.setRight(nodo);
    						inserito=true;
    					}
    					else tmp=tmp.getRight();
    				}
    				
    			
    				else if(tmp.getElement().compareTo(nodo.getElement())>0)
    				{
    					if(!(tmp.hasLeft())){
    						tmp.setLeft(nodo);
    						inserito=true;
    					}
    					else tmp=tmp.getLeft();
    				}
    			}
    					
    			}
    		nodes++;
    	}
    	
    	public E getMax(){
    		if(getRoot()==null) return null;
    		
    		BSTNode<E> tmp=getRoot();
    		
    		while(tmp.hasRight())
    			tmp=tmp.getRight();
    		
    		return (E)tmp;
    	}
    	
    	
    	public E remove()
    	{
    		if(size==0) return null;
    		
    		else{
    			BSTNode<E> remove=getMax();
    			if(!(remove.hasRight()) && !(remove.hasLeft()))
    			{
    				remove.getParent().setRight(null);
    				remove.setParent(null);
    				nodes--;
    				return (E)remove;
    			}
    			
    			else{
    				remove.getLeft().setParent(remove.getParent());
    				remove.getParent().setRight(remove.getLeft());
    				remove.setLeft(null);
    				nodes--;
    				return (E)remove;
    				}
    			}
    	}
    	
    	public boolean find(E label)
    	{
    		boolean trovato=false;
    		BSTNode<E> tmp=getRoot();
    		while(tmp!=null){
    			
    			if(tmp.getElement().compareTo(label)>0)
    				tmp=tmp.getLeft();
    			else if(tmp.getElement().compareTo(label)<0)
    				tmp=tmp.getRight();
    			
    			else trovato=true;
    		}
    		
    		return trovato;
    	}
    }
    
    class Node<E>
    {
    	private E element;
    	private Node<E> next;
    	
    	public Node(E element)
    	{
    		this.element=element;
    		next=null;
    	}
    	
    	public E getElement(){return element;}
    	public Node<E> getNext(){return next;}
    	public void setNext(Node<E> next){this.next=next;}
    }
    
    class Insieme<E> implements BSTSet270710<E>
    {
    	private Node<E> head;
    	private int items;
    	private int size;
    	
    	public Insieme()
    	{
    		head=null;
    		items=0;
    		size=0;
    	}
    	
    	
    	public Node<E> getHead(){return head;}
    	public int items(){return items;}
    	public int size(){return size;}
    	
    	public E getMax(int i)
    	{
    		if(size==0) return null;
    		int j=0;
    		Node<E> tmp=getHead();
    		
    		while(j!=i && tmp!=null)
    		{
    			tmp=tmp.getNext();
    			j++;
    		}
    		
    		E element=((BST)tmp.getElement()).getMax();
    	    return element;
    	}
    	
    	public BST<E> getBST (int i)
    	{
    		if(size==0) return null;
    		int j=0;
    		Node<E> tmp=getHead();
    		
    		while(j!=i && tmp!=null)
    		{
    			tmp=tmp.getNext();
    			j++;
    		}
    		
    		return tmp.getElement();
    	}
    	
    	public void add (BST<E> tree){
    		if(size==0)
    			head.setElement(tree);
    		
    		Node<E> nuovo=new Node(tree);
    		Node<E> tmp=head;
    		Node<E> prev=head;
    		boolean inserito=false;
    		E max=tree.getMax();
    		
    	    while(tmp.getNext()!=null && !inserito){
    	
    			if(tmp.getElement().getMax().compareTo(max)>0)
    			{
    				if(tmp==head)
    				{
    					nuovo.setNext(head);
    					head=nuovo;
    					inserito=true;
    				}
    				else{
    					prev.setNext(nuovo);
    					nuovo.setNext(tmp);
    					inserito=true;
    				       }
    			}
    			prev=tmp;
    			tmp=tmp.getNext();
    		}
    			
    			if(inserito!=true)
    				tmp.setNext(nuovo);
    		size++;
    	}
    	
    	public void addItem (E item, int i)
    	{
    		if(size==0) return;
    		
    		int j=0; 
    		Node<E> tmp=head;
    		
    		while(j!=i && tmp!=null){
    			j++;
    			tmp=tmp.getNext();
    		}
    		
    		tmp.getElement().addNodo(new BSTNode(item));
    	}
    	
    	
    	public BST<E> search(E item)
    	{
    		if(head==null) return null;
    		
    		boolean trovato=false;
    		Node<E> tmp=head.getElement();
    		BST<E> albero;
    		
    		while(tmp!=null && !trovato)
    		{
    			albero=tmp.getElement();
    			trovato=albero.find(item);
    		}
    		
    		return albero;
    	}
    	
    	public Iterator<BST<E>> iterator(){return null;}
    	
    	public E extractMax(){
    		Node<E> tmp=head;
    		
    		while(tmp.getNext()!=null)
    			tmp=tmp.getNext();
    		E max=tmp.getElement().getMax();
    		
    	   return max;
    	}
    }
    
    public class SS7_003292
    {
    	public static void main(String [] args)
    	{
    		Costruiscialbero("input.txt", "output.txt");
    	}
    	
    	public void Costruiscialbero(String input, String output)
    	{
    		Scanner s=null;
    		FileReader reader=null;
    		//BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try{
    			reader=new FileReader("input.txt");
    			out=new PrintWriter("output.txt");
    			s=new Scanner(new File(reader));
    			BST<BSTNode> albero=new BST(100);
    			Insieme<BST> insieme=new Insieme();
    			insieme.add(albero);
    			int k=0;
    			
    			while(s.hasNext())
    			{
    				if(s.next().equals(" "))
    				{
    					String value=s.next();
    					if(!(value.equals(";")))
    					{
    						insieme.addItem(value, k);
    						
    					}
    				
    					else	if(s.next().equals(";")){
    					BST<BSTNode> albero=new BST(100);
    						insieme.add(albero);
    						k++;
    					}
    				}
    			}
    			
    			int index=0;
    			
    			while(index<5)
    			{
    				insieme.extractMax();
    				index++;
    			}
    			
    			out.print(insieme.items()+" "+insieme.insieme.size()+"\r\n");
    			out.print(out.print(insieme.extractMax()));
    		      }
    		      
    		      catch(FileNotFoundException e1)
    		      {
    			      System.out.println("Error...file not found");
    		      }
    		      
    		      catch(IOException e2)
    		      {
    			      System.out.println("Error...file not found");
    		      }
    		      
    		      finally{
    				   try{
    					   reader.close();
    					   out.close();
    					}
    					
    					catch(IOException e3)
    					{
    						System.out.println("Error...it is not possible to close files");
    					}
    				}
    	}
    }
    Errore:
    codice:
    cannot find symbol
    symbol  : method compareTo(E)
    location: class java.lang.Object
    				if(tmp.getElement().compareTo(nodo.getElement())<0)
    Spero mi chiariate le cose, ne ho davvero bisogno, grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema interfaccia Comparable...aiuto!!!

    Originariamente inviato da Darčios89
    Errore:
    codice:
    cannot find symbol
    symbol  : method compareTo(E)
    location: class java.lang.Object
    				if(tmp.getElement().compareTo(nodo.getElement())<0)
    Spero mi chiariate le cose, ne ho davvero bisogno, grazie.
    La questione č questa:

    Quel tmp č un BSTNode<E>. Il getElement() su questo BSTNode restituisce appunto un E.
    Ora ... E č un tipo che ha compareTo (presumibilmente implementando Comparable)?? Non possiamo saperlo (perché č un "segnaposto") e non lo puņ "sapere" il compilatore. A meno, ovviamente, di cambiare la parametrizzazione in modo che a livello di compilazione E sia "ristretto" a solo oggetti che implementano Comparable e che quindi hanno un compareTo.

    Se non vuoi/puoi scegliere questa soluzione che lavora a livello di compilazione, puoi scegliere la soluzione a "runtime". Fai un cast a Comparable dell'oggetto che fornisce tmp.getElement().

    Ma ..... č a runtime! Sei poi sicuro che l'oggetto davvero implementa Comparable? Altrimenti avresti ClassCastException ... a runtime!

    Ti č pił chiara la questione?
    Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet

  3. #3
    E' chiaro come risolverla facendo il cast.....
    Ora io sapevo che il compareTo restituisce 0 se gli oggetti sono uguali, 1 se quello che invoca il metodo č maggiore dell'altro e -1 il contrario.
    Ma devo implementarlo io oppure basta solo che una classe estenda Comparable per fare funzionare compareTo?
    Cioč se non ho esigenze di fare overriding, posso solo fare implementare l'interfaccia o ci deve essere almeno una classe che ha il compareTo()?
    Perchč io non avevo implementato il metodo....e non so se devo farlo o se implementando l'interfaccia Comparable automaticamente il compareTo funziona come dicevo io.
    Non so come fare senza casting a Comparable....mi confondo....con i tipi....cioč dove ad esempio scrivere

    codice:
    class Esempio<E extends Comparable
    codice:
     class Esempio2<Eextends.....oppure implements? Comparable
    Ho troppa confusione. Le interfacce si implementano, ma allora quando devo usare extends e quando implements?
    Nel mio esercizio ho un insieme che contiene alberi, cioč:

    codice:
    class Insieme<E>
    dove E sara di tipo BST<E> dove quest'ultimo E sarą di tipo BSTNode<E> dove mi serve il comparato per E di BSTNode.
    Cioč...in mezzo a tutta sta roba, non mi compilerą mai
    Nel senso che faccio le cose in modo sbagliato, avevo provato a fare
    codice:
    BSTNode<E extends Comparable>
    Ma mi dą errori lo stesso....forse devo fare implementare Comparable a BSTNode<E>?

  4. #4
    Sia La classe BST che Insieme devono implementare il Comparable sennņ non ti riconosce, giustamente, il compareTo

    class BST<E extends Comparable> implements Comparable<BST<E>>

    stessa cosa per la classe Insieme.

  5. #5
    Allora lasciando tutto com'č e scrivendo:

    codice:
    class BST<E extends Comparable> implements Comparable<BST<E>>
    codice:
    class Insieme<E extends Comparable> implements Comparable<Insieme<E>>
    Ho degli errori, nell'interfaccia....mi dice:

    codice:
    SS7_003292.java:10: type parameter E is not within its bound
    public BST<E> getBST (int i);
               ^
    Devo cambiare l'intestazione dell'interfaccia o lasciarla come:

    codice:
    interface BSTSet270710<E> /*extends Iterable<BST<E>>*/
    ?

  6. #6
    Devi estendere anche l'interfaccia a Comparable e vedrai che risolvi tutto ;-)
    interface BSTSet<E extends Comparable>

  7. #7


    Non va...preciso che nel compareTo confronto l'elemento di un nodo e quindi uso cosģ compareTo nella classe BSTNode<E>

    codice:
    class BST<E extends Comparable> implements Comparable<BST<E>>
    {
    	private BSTNode<E> root;
    	private int nodes;
    	private final int CAPACITY;
    	
    	public BST(int CAPACITY)
    	{
    		this.CAPACITY=CAPACITY;
    		root=null;
    		nodes=0;
    	}
    	
    	public BSTNode<E> getRoot(){return root;}
    	public void setRoot(BSTNode<E> root){this.root=root;}
    	public int nodes(){return nodes;}
    	
    	public void addNodo(BSTNode<E> nodo)
    	{
    		if(nodes==0)
    			setRoot(nodo);
    		
    		else if(nodes<CAPACITY){
    			boolean inserito=false;
    			
    			BSTNode<E> tmp=getRoot();
    			
    			while(!inserito){
    				if(tmp.getElement().compareTo(nodo.getElement())<0)
    				{
    					if(!(tmp.hasRight())){
    						tmp.setRight(nodo);
    						inserito=true;
    					}
    					else tmp=tmp.getRight();
    				}
    				
    			
    				else if(tmp.getElement().compareTo(nodo.getElement())>0)
    				{
    					if(!(tmp.hasLeft())){
    						tmp.setLeft(nodo);
    						inserito=true;
    					}
    					else tmp=tmp.getLeft();
    				}
    			}
    					
    			}
    		nodes++;
    	}
    	
    	public E getMax(){
    		if(getRoot()==null) return null;
    		
    		BSTNode<E> tmp=getRoot();
    		
    		while(tmp.hasRight())
    			tmp=tmp.getRight();
    		
    		return (E)tmp;
    	}
    	
    	
    	public E remove()
    	{
    		if(nodes==0) return null;
    		
    		else{
    			BSTNode<E> remove=(BSTNode)getMax();
    			if(!(remove.hasRight()) && !(remove.hasLeft()))
    			{
    				remove.getParent().setRight(null);
    				remove.setParent(null);
    				nodes--;
    				return (E)remove;
    			}
    			
    			else{
    				remove.getLeft().setParent(remove.getParent());
    				remove.getParent().setRight(remove.getLeft());
    				remove.setLeft(null);
    				nodes--;
    				return (E)remove;
    				}
    			}
    	}
    	
    	public boolean find(E label)
    	{
    		boolean trovato=false;
    		BSTNode<E> tmp=getRoot();
    		BSTNode<E> node=new BSTNode(label);
    		while(tmp!=null){
    			
    			if(tmp.getElement().compareTo(node.getElement())>0)
    				tmp=tmp.getLeft();
    			else if(tmp.getElement().compareTo(node.getElement())<0)
    				tmp=tmp.getRight();
    			
    			else trovato=true;
    		}
    		
    		return trovato;
    	}
    }
    L'interfaccia diventa:
    codice:
    interface BSTSet270710<E extends Comparable>
    E in Insieme ho:
    codice:
    class Insieme<E extends Comparable> implements Comparable<Insieme<E>>
    Ma cosģ non va, mi dą sempre errore nell'uso del comparable...
    codice:
     BST is not abstract and does not override abstract method compareTo(BST<E>) in java.lang.Comparable
    class BST<E extends Comparable> implements Comparable<BST<E>>
    Credo dipenda sempre dal tipo che passo a Comparable.....

    P.S. ma nella classe insieme che implementa tra l'altro l'interfaccia BSTSet non dovrei avere tra l'altro una dichiarazione cosģ?

    codice:
    class Insieme<E extends Comparable> implements Comparable<Insieme<E>>, BSTSet270710<E>

  8. #8
    scusa errore mio...nella classe BST non c'č il metodo compareTo quindi la classe estende solo Comparable, senza implementarla. Infatti ti dice che non č astratta, perchč implementand Comparable non trova perņ il metodo.
    Se avevi:
    codice:
    public int compareTo(BSTNode<E> node)
    {
     qui ti vai a fare i confronti che restituiscono 0,-1,1
     .......
    
    }
    allora dovevi implementare Comparable. Spero di esserti stata d'aiuto

  9. #9
    Si ok, funziona, ora devo controllare il programma ma non ci sono errori di compilazione...
    Ma allora fammi capire, quando uso comparable devo farlo estendere sempre a tutte le classi che usano oggetti dove mi ritrovo il compareTo?

    Ad esempio, facciamo caso che ho una classe Coppia di oggetti che sono coppie di interi, e una classe Stack che contiene oggetti di tipo Coppia, allora se i miei oggetti usano il compareTo, devo definire cosģ il tutto?

    codice:
    public class Coppia<E>
    {
    .
    .
    .
    }
    codice:
    public class Stack<E extends Comparable>
    {
    .
    .
    }
    Se invece la mia coppia ha un compareTo diverso da quello standard faccio implementare il metodo alla classe stack cosģ:

    codice:
    public class Stack<E extends Comparable> implements Comparable<Stack<E>>
    {
    .
    .
    }
    Corretto cosģ il funzionamento?

    Grazie di tutto.

  10. #10
    Si non dą problemi la Comparable, ci sono sempre errori nella logica del programma....
    Non riesco a risolvere i nullpointerException...ricontrollando i metodi mi sembrano a posto.
    Nel main praticamente devo leggere in input dei valori, inserirli in un albero e poi inserire quest' ultimo nel mio insieme, ma quando provo ad aggiungere l'albero nell'insieme mi viene detto che l'albero č vuoto...mentre dai metodi mi sembra di aggiungere i nodi correttamente...non sono riuscito a trovare errori nella classe BST<E> nel metodo addNodo...ho commentato dove si verifica l'errore.

    codice:
    import java.util.*;
    import java.io.*;
    interface BSTSet270710<E extends Comparable> /*extends Iterable<BST<E>>*/{
    public int items ();
    // ritorna il numero di items (di tipo E) dell'insieme
    public int size ();
    // ritorna il numero di elementi (di tipo BST<E>) dell'insieme
    public E getMax (int i);
    // ritorna il rappresentante dell'albero di posizione i
    public BST<E> getBST (int i);
    // ritorna l'albero di posizione i
    public void add (BST<E> tree);
    // aggiunge un nuovo albero all'insieme
    public void addItem (E item, int i);
    // aggiunge un nuovo item all'albero di posizione i
    public BST<E> search(E item);
    // ritorna il primo albero dell'insieme contenente l'item E
    public Iterator<BST<E>> iterator();
    // ritorna un iteratore di tutti gli alberi dell'insieme
    public E extractMax();
    // elimina e ritorna l'item pił grande dell'insieme
    }
    
    class BSTNode<E>
    {
    	private E element;
    	private BSTNode<E> left;
    	private BSTNode<E> right;
    	private BSTNode<E> parent;
    	
    	public BSTNode(E element)
    	{
    		this.element=element;
    		left=null;
    		right=null;
    		parent=null;
    	}
    	
    	public void setParent(BSTNode<E> parent){this.parent=parent;}
    	public BSTNode<E> getParent(){return parent;}
    	public E getElement(){return element;}
    	public BSTNode<E> getLeft(){return left;}
    	public void setLeft(BSTNode<E> left){this.left=left;}
    	public BSTNode<E> getRight(){return right;}
    	public void setRight(BSTNode<E> right){this.right=right;}
    	public boolean hasLeft(){return left!=null;}
    	public boolean hasRight(){return right!=null;}
    
    }
    
    class BST<E extends Comparable>
    {
    	private BSTNode<E> root;
    	private int nodes;
    	private final int CAPACITY;
    	
    	public BST(int CAPACITY)
    	{
    		this.CAPACITY=CAPACITY;
    		root=null;
    		nodes=0;
    	}
    	
    	public BSTNode<E> getRoot(){return root;}
    	public void setRoot(BSTNode<E> root){this.root=root;}
    	public int nodes(){return nodes;}
    	
    	public void addNodo(BSTNode<E> nodo)
    	{
    		if(nodes==0)
    			setRoot(nodo);
    		
    		else if(nodes<CAPACITY){
    			boolean inserito=false;
    			
    			BSTNode<E> tmp=getRoot();
    			
    			while(!inserito){
    				if(tmp.getElement().compareTo(nodo.getElement())<0)
    				{
    					if(!(tmp.hasRight())){
    						tmp.setRight(nodo);
    						inserito=true;
    					}
    					else tmp=tmp.getRight();
    				}
    				
    			
    				else if(tmp.getElement().compareTo(nodo.getElement())>0)
    				{
    					if(!(tmp.hasLeft())){
    						tmp.setLeft(nodo);
    						inserito=true;
    					}
    					else tmp=tmp.getLeft();
    				}
    			}
    					
    			}
    		nodes++;
    	}
    	
    	public E getMax(){
    		if(getRoot()==null) return null;
    		
    		BSTNode<E> tmp=getRoot();
    		
    		while(tmp.hasRight())
    			tmp=tmp.getRight();
    		
    		return (E)tmp;
    	}
    	
    	
    	public E remove()
    	{
    		if(nodes==0) return null;
    		
    		else{
    			BSTNode<E> remove=(BSTNode)getMax();
    			if(!(remove.hasRight()) && !(remove.hasLeft()))
    			{
    				remove.getParent().setRight(null);
    				remove.setParent(null);
    				nodes--;
    				return (E)remove;
    			}
    			
    			else{
    				remove.getLeft().setParent(remove.getParent());
    				remove.getParent().setRight(remove.getLeft());
    				remove.setLeft(null);
    				nodes--;
    				return (E)remove;
    				}
    			}
    	}
    	
    	public boolean find(E label)
    	{
    		boolean trovato=false;
    		BSTNode<E> tmp=getRoot();
    		BSTNode<E> node=new BSTNode(label);
    		while(tmp!=null){
    			
    			if(tmp.getElement().compareTo(node.getElement())>0)
    				tmp=tmp.getLeft();
    			else if(tmp.getElement().compareTo(node.getElement())<0)
    				tmp=tmp.getRight();
    			
    			else trovato=true;
    		}
    		
    		return trovato;
    	}
    }
    
    class Node<E>
    {
    	private BST element;
    	private Node<E> next;
    	
    	public Node(BST element)
    	{
    		this.element=element;
    		next=null;
    	}
    	
    	public void setElement(BST element){this.element=element;}
    	public BST getElement(){return element;}
    	public Node<E> getNext(){return next;}
    	public void setNext(Node<E> next){this.next=next;}
    }
    
    class Insieme<E extends Comparable> implements BSTSet270710<E>
    {
    	private Node<E> head;
    	private int items;
    	private int size;
    	
    	public Insieme()
    	{
    		head=null;
    		items=0;
    		size=0;
    	}
    	
    	public Node<E> getHead(){return head;}
    	public int items(){return items;}
    	public int size(){return size;}
    	
    	public E getMax(int i)
    	{
    		if(size==0) return null;
    		int j=0;
    		Node<E> tmp=getHead();
    		
    		while(j!=i && tmp!=null)
    		{
    			tmp=tmp.getNext();
    			j++;
    		}
    		
    		BST<E> tree=(BST)tmp.getElement();
    		
    	    return tree.getMax();
    	}
    	
    	public BST<E> getBST (int i)
    	{
    		if(size==0) return null;
    		int j=0;
    		Node<E> tmp=getHead();
    		
    		while(j!=i && tmp!=null)
    		{
    			tmp=tmp.getNext();
    			j++;
    		}
    		
    		return (BST)tmp.getElement();
    	}
    	
    	public void add (BST<E> tree){
    		if(size==0)
    			head.setElement(tree);    //chiamata nullpointer che sale qui
    		
    		else{
    		
    			Node<E> nuovo=new Node(tree);
    			Node<E> tmp=head;
    			Node<E> prev=head;
    			boolean inserito=false;
    			E max=tree.getMax();
    		
    		              while(tmp.getNext()!=null && !inserito){
    		
    				if(((BST)tmp.getElement()).getMax().compareTo(max)>0)
    				{
    					if(tmp==head)
    					{
    						nuovo.setNext(head);
    						head=nuovo;
    						inserito=true;
    					}
    				  else{
    					prev.setNext(nuovo);
    					nuovo.setNext(tmp);
    					inserito=true;
    				       }
    				}
    				prev=tmp;
    				tmp=tmp.getNext();
    				}
    			
    			if(inserito!=true)
    				tmp.setNext(nuovo);
    		      }
    		size++;
    	}
    	
    	public void addItem (E item, int i)
    	{
    		if(size==0) return;
    		
    		int j=0; 
    		Node<E> tmp=head;
    		
    		while(j!=i && tmp!=null){
    			j++;
    			tmp=tmp.getNext();
    		}
    		
    		((BST)tmp.getElement()).addNodo(new BSTNode(item));
    	}
    	
    	
    	public BST<E> search(E item)
    	{
    		if(head==null) return null;
    		
    		boolean trovato=false;
    		BST<E> tmp=(BST)head.getElement();
    		BST<E> albero=null;
    		
    		while(tmp!=null && !trovato)
    		{
    			albero=tmp;
    			trovato=albero.find(item);
    		}
    		
    		return albero;
    	}
    	
    	public Iterator<BST<E>> iterator(){return null;}
    	
    	public E extractMax(){
    		Node<E> tmp=head;
    		
    		while(tmp.getNext()!=null)
    			tmp=tmp.getNext();
    		E max=(E)((BST)tmp.getElement()).getMax();
    		
    	   return max;
    	}
    }
    
    public class SS7_003292
    {
    	public static void main(String [] args)
    	{
    		Costruiscialbero("input.txt", "output.txt");
    	}
    	
    	public static void Costruiscialbero(String input, String output)
    	{
    		Scanner s=null;
    		FileReader reader=null;
    		//BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try{
    			reader=new FileReader("input.txt");
    			out=new PrintWriter("output.txt");
    			s=new Scanner(reader);
    			BST albero=new BST(100);
    			Insieme insieme=new Insieme();
    			int k=0;
    			
    			while(s.hasNext())
    			{
    			
    				if(s.hasNextInt())
    					albero.addNodo(new BSTNode(s.next()));
    				else	if(s.next().equals(";")){
    					insieme.add(albero);     //nullpointerException
    					albero=new BST(100);
    				}
    				
    			}
    			
    			int index=0;
    			
    			while(index<5)
    			{
    				insieme.extractMax();
    				index++;
    			}
    			
    			out.print(insieme.items()+" "+insieme.size()+"\r\n");
    			out.print(insieme.extractMax());
    		    }
    		      
    		
    		      catch(FileNotFoundException e1)
    		      {
    			      System.out.println("Error...file not found");
    		      }
    		      
    		      catch(IOException e2)
    		      {
    			      System.out.println("Error...file not found");
    		      }
    		      
    		      finally{
    				   try{
    					   reader.close();
    					   out.close();
    					}
    					
    					catch(IOException e3)
    					{
    						System.out.println("Error...it is not possible to close files");
    					}
    				}
    	}
    }

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.