| 	
	
	
		
		|||||||
  | 
		
| 
 | 
![]()  | 
	
	
| 
		 | 
	Strumenti | 
| 		
			
			 | 
		#1 | 
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	
	
	
		
			
			 
				
				[JAVA] Collezione omogenea di oggetti relazionabili...sono in crisi con un metodo...
			 
			
		Ciao, 
		
	
		
		
		
		
		
		
			stò tentando di rifare il compito d'esame su cui sono stato bocciato la volta scorsa...ma ho dei problemi (HELP ME...il nuovo appello si avvicina). Allora i primi 2 punti chiedono: Si richiede la possibilità di rappresentare e gestire una collezione omogenea e dinamica di oggetti generici per i quali è possibile definire una generica relazione booleana: due oggetti possono essere oppure non essere in relazione. 1) Si richiede l’implementazione del tipo CollezioneConRelazione mediante la classe Java CollezioneConRelazione. 2) Sia definito un operatore di accesso in lettura (osservatore) che, a partire da un dato parametro, opera come segue: · se la collezione contiene elementi in relazione con il parametro, l’operatore calcola un iteratore che enumera tutti gli elementi della collezione che sono in relazione con tale parametro; · qualora la collezione non contenga elementi in relazione con il parametro, l’operatore calcola il primo elemento della collezione. Mi sono completamente bloccato sul punto numero 2 (qualche idea peròla ho...anche perchè avevo parlato con persone che erano riuscite a passare l'esame e mi avevano dato qualche idea). Io perora ho fatto così: Per prima cosa definisco l'interfaccia Relazionabile che mi definisce tipi di dati generici che come unico comportamento comune hanno quello di saper rispondere se due oggetti sono in relazione tra loro: Codice: 
	/** OVERVIEW: Si tratta di un'interfaccia che descrive oggetti generici che hanno come caratteristica comune quella di
 			  sapere se due oggetti sono in relazione tra loro */
 			  
public interface Relazionabile{
	
	boolean isInRelation(Relazionabile r);
}
E fin quà sono sicuro che va tutto bene: Codice: 
	import java.util.*;
/** OVERVIEW: La classe implementa una collezione omogenea (cioè contenente dati aventi tutti lo stesso tipo effettivo) e
			  dinamica di oggetti aventi Relazionabile come supertipo */
			  
public class CollezioneConRelazione{
	
		Vector collezione;		// Rappresenta la collezione
		
		/** COSTRUTTORE:
			EFFECTS: Costruisce un nuovo oggetto di tipo CollezioneConRelazione
			@param: void
			@return: Il riferimento ad un oggetto di tipo CollezioneConRelazione */
			
		public CollezioneConRelazione(){
			collezione = new Vector();		// Crea la collezione assegnando a collezione il riferimento ad un vector vuoto
		}
		
		/** METODO INSERT():
			EFFECTS: Se il Vector è vuoto inserisce un qualasiasi oggetto Relazionabile nella collezione, se ci sono già
					 altri oggetti inserisce l'oggetto referenziato dal paramentro dentro la collezione solamente se esso è
					 omogeneo con gli altri elementi della collezione, altrimenti solleva un'eccezione
			@param: Un oggetto di tipo Relazionabile
			@return: void */
			
		public void insert(Relazionabile r){
			
			int dimensione = collezione.size();		// Contiene la dimensione della collezione
			
			if(dimensione == 0)						// Se la collezione è vuota
				collezione.addElement(r);			// Il metodo aggiunge un qualsiasi Relazionabile alla collezione
			
			 		
			else{	// Se invece la collezione non è vuota bisogna controllare che il parametro sia omogeneo con gli altri elementi 
				if(collezione.elementAt(0).getClass().isInstance(r))// Se il tipo del primo elemento è lo stesso del parametro r
					collezione.addElement(r);						// allora aggiunge l'elemento in coda alla colleazione
				else throw new ElementoNonValidoException();		// Altrimenti solleva un'eccezione
			}	
		}
		
		/** METODO READ():
			EFFECTS: Il metodo read() in base al parametro di input param opera nel seguente modo:
					 1) Se la collezione contiene elementi in relazione con il parametro, l'operatore calcola un iteratore
					    che enumera tutti gli elementi della collezione che sono in relazione con il parametro.
					 2) Qualora la collezione non contenga elementi in relazione con il parametro, l'operatore calcola il
					    primo elemento della collezione
			@param: Il riferimento ad un oggetto di tipo Relazionabile
			@return: Un oggetto di tipo MioIteratore che rappresenta l'iteratore richiesto dalle specifiche
			@throw: Un'eccezione che eventualmente contenga il primo valore contenuto nella collezione */
		
		
}
Realizzare un particolare iteratore che prende come parametro un oggetto di tipo Relazionabile, l'iteratore restituisce tutti gli oggetti della collezione in relazione con tale parametro (se esistono), se invece non esiste nessun oggetto in relazione con il parametro SOLLEVA UN'ECCEZIONE CHE CONTIENE AL SUO INTERNO IL PRIMO ELEMENTO DELLA COLLEZIONE. Io però non ho la minima idea di come si faccia un iteratore che accetti un parametro...mi potete dare una mano? Grazie mille Ultima modifica di Rintrah84 : 09-07-2009 alle 11:29.  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#2 | |
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Oct 2007 
				Città: Padova 
				
				
					Messaggi: 4131
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
 tipo: Codice: 
	public class Iteratore
{
    public Iteratore(Relazionabile r)
    {
         //...
    }
}
				__________________ 
		
		
		
		
	
	As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford)  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#3 | |
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#4 | 
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		mmm...ok...ho fatto come mi è venuto in mente...ma temo sia un po' un delirio e mi da anche qualche problemuccio in fase di compilazione... 
		
	
		
		
		
		
		
	
	Non riscrivo tutta la classe se no sarebbe lunghissimo. Nella classe CollezioneConRelazione ho aggiunto una classe interna chiamata MioIteratore che implementa Iterator e che contiene al proprio interno 4 metodi: 1) Il costruttore dell'iteratore: se nella collezione è presente un oggetto relazionabile con il parametro r che riceve, fà partire da là l'iterazione; altrimenti solleva un'eccezione che contiene il riferimento al primo elemento della collezione. 2) next(): restituisce l'elemento corrente della collezione 3) hasNext(): Restituisce TRUE se nella collezione sono presenti altri elementi relazionabili con il parametro r o FALSE se non ci sono 4) remove(): Rimuove dall'iteratore l'elemento corrente (non dalla collezione), spostando l'indice all'eventuale altro oggetto in relazione con r presente nella collezione (se presente, altrimenti termina l'iterazione) mmm sò che gli iteratori si possono fare anche in altri modi ma alla proff piacciono solo con questi 4 metodi precisi... Poi ho creato un metodo enumera fuori dalla classe interna che semplicemente crea il mio iteratore e lo restituisce (per mascherarlo). E poi ho creato il metodo read() che prende un relazionabile come parametro, prova a creare e a restituire l'iteratore specifico. Se nella collezione è presente almeno un elemento in relazione con il parametro r viene creato l'iteratore e restituito dal metodo read; Se invece nella collezione non è presente nessun oggetto in relazione con il parametro r, il metodo read cattura l'eccezione che contiene il riferimento al primo oggetto della collezione e la gestisce rimandandola al chiamante: Il codice iper commentato del mio impiccio è questo: Codice: 
			/** METODO READ():
			EFFECTS: Il metodo read() in base al parametro di input param opera nel seguente modo:
					 1) Se la collezione contiene elementi in relazione con il parametro, l'operatore calcola un iteratore
					    che enumera tutti gli elementi della collezione che sono in relazione con il parametro.
					 2) Qualora la collezione non contenga elementi in relazione con il parametro, l'operatore calcola il
					    primo elemento della collezione
			@param: Il riferimento ad un oggetto di tipo Relazionabile
			@return: Un oggetto di tipo MioIteratore che rappresenta l'iteratore richiesto dalle specifiche
			@throw: Un'eccezione che eventualmente contenga il primo valore contenuto nella collezione */
		
		public MioIteratore read(Relazionabile param){
			
			Iterator it;			// Dichiaro una variabile di tipo Iterator
			
			try{					// Prova a costruire l'iteratore invocando il metodo enumera sulla collezione
				it = collezione.enumera();
			}catch(OggettiNonRelazionabiliException e){	  // Cattura l'eventuale eccezione OggettiNonRelazionabiliException
				/* E la gestisce rinviandola al chiamante che così riceve un'eccezione che contiene il riferimento al primo
				   oggetto della collezione */
				throw new ggettiNonRelazionabiliException(collezione.elementAt(0));
				}
			
			return it;
			
		}
		
		
		private class MioIteratore implements Iterator{		// E' la classe interna che implementa l'interfaccia Iterator
		
			private int dove;	  // Variabile che indica dove ci si trova all'interno della collezione durante l'iterazione
			private int next;	  // Contiene l'indice del prossimo elemento della collezione relazionabile con il parametro
			
			
			/* Costruttore del generatore, riceve come parametro un oggetto reazionabile e costruisce l'iteratore partendo
			   dal primo oggetto della collezione che è in relazione con il parametro (se esiste); Altrimenti se non esiste
			   solleva un'eccezione che contiene il riferimento al primo elemento della collezione */
			   
			public MioIteratore(Relazionabile r){		
				
				int i;		// Variabile contatore per scorrere la collezione
				boolean isFirst = false;
				
				/* Scorre tutta la collezione finchè non raggiunge la fine oppure non trova un oggetto relazionabile con il
				   parametro */
				for(i=0; i<collezione.size() && !isFirst; i++){		
					
					/* Se l'elemento corrente della collezione è relazionabile con il parametro mette dentro dove la sua
					   posizione e setta a true la variabile isFirst per terminare il ciclo */
					if(collezione.elementAt(i).isInRelation(r)){
						dove = i;			// Mette la posizione del primo elemento in relazione dentro dove
						isFirst = true;		// Setta a true la variabile isFirst così da uscire dal ciclo
					}
				}
				
				/* Se alla fine del ciclo isFirst è ancora false significa che la collezione è stata interamente scandita
				   senz che sia stato trovato nessun oggetto in relazione con il paramentro per cui viene sollevata
				   un'eccezione che contiene il riferimento al primo oggetto della collezione */
				if(isFirst = false) throw new OggettiNonRelazionabiliException(collezione.elementAt(0));
			}
			
			/* Il metodo next() ritorna l'elemento corrente della collezione (che è in relazione con il parametro) */
			
			public Object next(){
					return collezione.elementAt(dove);	
			}
			
			/* Il metodo hasNext() risponde true se l'oggetto nella collezione alla posizione indicata dalla variabile dove
			   non è l'ultimo oggetto della collezione ad essere in relazione con il paramentro r */
			  
			public boolean hasNext(Relazionabile r){
				
				/* Variabile per scorrere la collezione alla ricerca del prossimo oggetto relazionabile con il paramentro r,
				   viene inizializzata a dove pechè deve vedere se dopo l'elemento corrente ci stà un altro elemento
				   relazionabile nella collezione */
				int i = dove;
		
				boolean altroRelazionabile = false;
				
				/* Scorre tutta la collezione e termina quando non ci sono più elementi nella collezione o quando è stato
				   trovato il prossimo elemento della collezione che è in relazione con il parametro r */
				while(i<collezione.size && !altroRelazionabile){
					
					/* Se l'elemento corrente della collezione è relazionabile con il parametro m setta a true la variabile 
				      altroRelazionabile per terminare il ciclo e mette dentro next la posizione del prossimo elemento
				      relazionabile con il parametro */
				   if(collezione.elementAt(i).isInRelation(r)){
					   next = i;						// Setta next con il valore della posizione corrente
					   altroRelazionabile = true;		// Setta a TRUE altroRelazionsabile per terminare la ricerca
				   }
			   }
				   
			   /* Ritorna altroRelazionabile che indica al chiamante se nella collezione è presente o meno un altro oggetto
			      che è in relazione con il parametro r */
			   return altroRelazionabile;
		   }
		   
		   /* Il metodo remove() rimuove l'elemento dall'iteratore (non dalla collezione) spostando dove al successivo 
		   	  elemento della collezione che è in relazione con il parametro r */
		   	  
		   public void remove(){
			   dove = next;			// Setta dove a next calcolato precedentemente mediante hasNext()
		   }
	   
		}
		
		/* Maschero l'implementazione di MioIterator usando un metodo enumera esterno alla classe interna */
		public Iterator enumera(Relazionabile r){		
			return new MioIteratore(Relazionabile r);
		}
Come mai mi dà questo errore n fase di compilazione? Codice: 
	C:\Programmi\Crimson Editor\template\esercizi\esami\08-06-2009>javac CollezioneConRelazione.java
CollezioneConRelazione.java:148: ')' expected
                        return new MioIteratore(Relazionabile r);
                                                             ^
CollezioneConRelazione.java:148: not a statement
                        return new MioIteratore(Relazionabile r);
                                                              ^
CollezioneConRelazione.java:148: ';' expected
                        return new MioIteratore(Relazionabile r);
                                                               ^
3 errors
 | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#5 | |
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Oct 2007 
				Città: Padova 
				
				
					Messaggi: 4131
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
 Codice: 
	return new MioIteratore(r); Non ho un backgroud di studi rigorosi/università circa la programmazione percui potrei vedere le cose in modo molto diverso da come le valuta uno studioso o un professore. Funziona? Allora direi che va bene (almeno è un punto da cui partire) 
				__________________ 
		
		
		
		
	
	As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford)  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#6 | |
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
 Volevo solo sapere se secondo te come logica ci può stare (a prescindere dal rigore di un proff...magari non mi darebbe tutti i punti ma se proprio non ho scritto cappellate abberranti non mi darebbe comunque 0 punti)  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#7 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Oct 2007 
				Città: Padova 
				
				
					Messaggi: 4131
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		Beh, come logica ci sta, secondo me  
		
	
		
		
		
		
			
				__________________ 
		
		
		
		
	
	As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford)  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#8 | 
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		ti ringrazio...speriamo bene...già una volta mi ci ha bocciato perchè avevo cannato in pieno questo iteratore...poi ci sono un altro paio di esercizzi in questo compito...ora li vedo poi semmai posto qualche altro dubbio  
		
	
		
		
		
		
		
	
	Tnx  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#9 | |
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Oct 2007 
				Città: Padova 
				
				
					Messaggi: 4131
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 Quote: 
	
 Solo così puoi essere sicuro di non ripeterli. 
				__________________ 
		
		
		
		
	
	As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford)  | 
|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#10 | 
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#11 | 
| 
			
			
			
			 Senior Member 
			
		
			
				
			
			
			Iscritto dal: Oct 2007 
				Città: Padova 
				
				
					Messaggi: 4131
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		Ah, e beh!  
		
	
		
		
		
		
			Allora già il fatto di averne scritto uno che funziona è un grande passo avanti 
				__________________ 
		
		
		
		
	
	As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford)  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#12 | 
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	|
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#13 | 
| 
			
			
			
			 Bannato 
			
		
			
			
			Iscritto dal: Jun 2009 
				Città: Roma 
				
				
					Messaggi: 102
				 
				
				
				
				 | 
	
	
	
	
		
		
		
		 
		Ok...altro problema (scusa se rompo ancora)... 
		
	
		
		
		
		
		
	
	c'è un altro punto del compito che dice: Problema 3: Si richiede l’implementazione in Java di un metodo modifica di tipo void di seguito descritto: · I parametri del metodo sono un oggetto di tipo CollezioneConRelazione e due oggetti ogg1 e ogg2 · Il metodo verifica se la collezione contiene elementi in relazione con ogg1 e: o in caso affermativo, rimuove dalla collezione tutti gli elementi in relazione con ogg1; o altrimenti, se il primo elemento della collezione è in relazione con ogg2, rimuove dalla collezione il suo primo elemento e vi inserisce ogg2. Bene...l'ho fatto ma sicuramente è pieno zeppo di errori. L'idea è questa: Il metodo modifica() è contenuto in un'altra classe che ho chiamato Utility. Riceve come parametri di input ogg1 ed ogg2 di tipo Relazionabile ed un altro oggetto chiamato collezione di tipo CollezioneConRelazione. Dichiaro un iteratore e provo a costruirlo mediante il metodo enumera() della classe CollezioneConRelazione passandogli l'oggetto ogg1. Se viene sollevata l'eccezione OggettiNonRelazionabiliException allora significa che nella collezione non c'è nessun oggetto che è in relazione con il parametro ogg1, l'eccezione allora viene gestita controllando se ogg2 è in relazione con il primo elemento della collezione: se lo è ogg2 viene sostituito al primo elemento della collezione, altrimenti non succede nulla. Se l'eccezione non viene sollevata allora vuol dire che almeno un elemento della collezione è in relazione con ogg1...allora devo usare l'iteratore per eliminare dalla collezione tutti gli elementi restituiti dall'iteratore (problemaccio) Come logica può andare? Il mio codice sbagliato è questo: Codice: 
	import java.util.*;
/** OVERVIEW: Si tratta di una classe contenitore di metodi utili per la gestione di oggetti di tipo 
			  CollezioneConRelazione */
public class Utility{
		
	/** EFFECTS: Riceve in ingresso due oggetti di tipo Relazonabile ogg1 ed ogg2 ed un oggetto di tipo
				 CollezioneConRelazione. Il metodo verificare se la collezione contiene oggetti in relazione con ogg1 ed in
				 caso affermativo rimuove dalla collezione tutti gli elementi in relazione con ogg1; Altrimenti, se il primo
				 elemento della collezione è in relazione con ogg2 allora rimuove il primo elemento e lo sostituisce con
				 ogg2
		@param: ogg1 di tipo Relazionabile
		@param: ogg2 di tipo Relazionabile
		@param: collezione di tipo CollezioneConRelazione
		@return: void */
	
	public void modifica(Relazionabile ogg1, Relazionabile ogg2, CollezioneConRelazione collezione){
		
		Iterator it;							// Dichiaro una variabile di tipo iteratore
		
		try{					// Prova a costruire l'iteratore invocando il metodo enumera sulla collezione
			it = collezione.enumera(ogg1);		// Crea il corretto iteratore per il parametro collezione
		
			/* Finchè nella collezione ci sono ancora elementi su cui iterare (elementi in relazione con ogg1) */
			while(it.hasNext()){
					collezione.remove(it.next());	 // Rimuove dalla collezione l'elemento corrente in relazione con il parametro ogg1
					/* Passa al successivo elemento rimuovendo quello corrente dall'iteratore (non dalla collezione) */
					it.remove();
			}
		}catch(OggettiNonRelazionabiliException e){	  // Cattura l'eventuale eccezione OggettiNonRelazionabiliException
				/* E la gestisce controllando se il primo elemento della collezione è in relazione con ogg2 */
				if(collezione.elementAt(0).isInRelation(ogg2))
					insertElementAt(ogg2, 0);			// Sostituisce l'elemento in prima posizione con ogg2
			}	// L'eventuale eccezione ricevuta è stata gestita
			
	}
}
Grazie  | 
| 
		
 | 
	
	
	
		
		
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
		
		  
	   | 
| Strumenti | |
		
  | 
	
		
  | 
Tutti gli orari sono GMT +1. Ora sono le: 01:45.









		
		
		


 
 







