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

    Classe che gestisce una collezione di stringhe particolari, dove sbaglio? Help me :-(

    Ciao,
    stò vedendo degli esercizzi stile compito d'esame (che è vicinissimo per cui vi prego di darmi una mano).
    Sono un po' in crisi con questo esercizio:

    Scrivere una classe Java chiamata Involucro che rappresenta collezioni di stringhe del tipo <s1, s2, s3,....,sn> tali che s1 è interamente contenuta in s2, s2 è interamente contenuta in s3, e così via.

    Quindi penso io collezioni di stringhe tipo questa:

    {'a', 'ab', 'abc'} ma anche di questo tipo {'z', 'az', 'azr', 'xazr'} perchè basta che l'i-esima stringa sia contenuta nella (i+1)-esima stringa della collezione

    Le operazioni richieste sono:
    a) Inserimento di una stringa in un oggetto di tipo involucro con modifica di tale oggetto.

    b) Fusione di due oggetti <s1,s2,s3,...,sn> e <t1,t2,t3,...,tn> di tipo Involucro per formare un nuovo oggetto <s1,s2,s3,...,sn,t1,t2,t3,...,tn> Si osservi che questa operazione non è sempre possibile.

    c) Accesso in lettura alla collezione


    Bene...io l'ho risolto così...però mi dà vari errori in fase di compilazione che non riesco a risolvere.
    (Il codice sembra lungo ma non lo è perchè è pieno di documentazione...la vuole la proff sull'esame e mi stò abituando a farla anche a casa...magari potete saltarla)

    codice:
    public class Involucro{
    	/** OVERVIEW: Involucro rappresenta una collezione dinamica di stringhe del tipo <s1, s2, s3,...., sn> tali che 
    				  s_i è completamente contenuta in s_(i+1).
    				  
    				  V = {{s1,s2,s3,...,sn>: Per ogni i s_i è una stringa ed s_i è interamente contenuto in s_(i+1)}}
    				  
    				  O = inserisci: Se l'oggetto che si vuole inserire è coerente con la rappresentazione della collezione
    				                 (è una stringa) e con lo stato attuale della collezione (i valori già presenti nella
    				                 collezione), allora lo inserisce nella collezione modificandola
    				      
    				      fondi: Date collezioni S e T se s_n è interamente contenuto in t_1 allora fonde le due collezioni nel
    				             seguente modo: S = <s1,s2,s3,...,sn> T = {t1,t2,t3,...,tn} --> {s1,s2,s3,...,sn,t1,t2,t3,..,tn}
    				      
    				      get(i): Accede in maniera posizionale all'i-esimo elemento della collezione */
    				     
    	private Vector collStr;			// Rappresenta la collezione di stringhe
    	
    	
    	/** FUNZIONE DI ASTRAZIONE: F_a(): STATO CONCRETO ----> STATO ASTRATTO
    								F_a([a, ab, abc, abcd]) ------> {<a, ab, abc, abcd>}
    								ma anche: F_a([a, b(a), (ba)f, z(baf), (zbaf)e]) ---> {a, ba, baf, zbaf, zbafe}
    								
    		INVARIANTE DI RAPPRESENTAZIONE: è un predicato I: C ---> boolean che è vero per gli stati concreti che sono
    										rappresentazioni leggittime di uno stato astratto:
    										
    										I(collStr): collStr != NULL (il Vector deve essere sempre diverso da NULL)
    										Per ogni i: v.get(i) deve essere incluso in v.get(i+1) (la i-esima stringa deve
    										sempre essere interamente contenuta nella (i+1)-esima stringa della collezione */
    										
    	/** COSTRUTTORE:
    		EFFECTS: Crea un nuovo oggetto di tipo Involucro che rappresenta la collezione vuota
    		@param: void:
    		@return: Il riferimento ad un oggetto di tipo Involucro
    		Il costruttore soddisfa l'invariante di rappresentazione in quanto: 1) Viene assegnata alla variabile di istanza
    		collStr il riferimento ad un nuovo Vector quindi no è mai null. 2) Il costruttore crea una collezione vuota che
    		rappresenta la stringa vuota contenuta in ogni stringa, quindi qualsiasi sia il primo elemento va bene */
    		
    	public Involucro(){
    		collStr = new Vector();		// Crea la collezione vuota assegnando a collStr il riferimento ad un nuovo Vector vuoto
    	}
    	
    	/** Metodo inserisci()
    		EFFECTS: Se il parametro può essere inserito nella collezione (se contiene completamente l'ultima stringa della
    				 collezione, allora viene inserito nella collezione rappresentata dall'oggetto ricevente, altrimenti viene
    				 sollevata una StringaNonValidaException
    		MODIFIES: this
    		@param: Un oggetto di tipo String 
    		Il metodo inserisci() soddisfa l'invariante di rappresentazione in quanto se la collezione è vuota permette
    		l'inserimento di una stringa qualsiasi, se invece nella collezione è già presente qualcosa prima di inserire il
    		parametro controlla che il parametro contiene completamente l'ultima stringa presente nella collezione. Se ciò è
    		verificato la inserisce, altrimenti no e la collezione rimane sempre coerente con la sua definizione */
    				 
    	public void inserisci(String s){
    		
    		int n = this.collStr.size(); 	// Mette in n il numero di elementi presenti nella collezione ricevente
    		
    		if(collStr.size() == 0)			// Se la collezione è vuota
    			collStr.addElement(s);		// allora aggiungi l'elemento in prima posizione
    		else{							// Se invece la collezione non è vuota
    			if(s.contains(this.collStr[n]))	// Se la stringa parametro s contiene l'ultima stringa della collezione
    				collStr.addElement(s);	// allora agiunge l'elemento nella collezione
    			else throw new StringaNonValidaException();	// Altrimenti non lo inserisce e solleva un'eccezione
    		}
    	}
    	
    	/** Metodo fondi():
    		EFFECTS: Se possibile fonde la collezione ricevente con quella referenziata dal parametro. Tale fusione è possibile
    				 se e solo se l'ultimo elemento della collezione ricevente è totalmente contenuto nel primo elemento della
    				 collezione referenziata dal parametro, altrimenti solleva una CollezioneParametroNonValidaExcepion
    				 Eventualmente la dusione fosse possiebileil metodo crea una nuova collezione che contiene la fusione delle
    				 due collezioni iniziali.
    		@param: Il riferimento ad un oggetto Involucro
    		@return: Il riferimento ad un nuovo oggetto Involucro
    		Il metodo rispetta l'invariante di rappresentazione in quanto ne l'oggetto ricevente, ne il parametro possono essere
    		null e poichè l'eventuale nuova collezione rispetta la proprietà che Per ogni i, l'i-esima stringa è sempre
    		contenuta nella (i+1)-esima stringa */
    		
    	public Involucro fondi(Involucro i){
    		
    		int n = this.collStr.size(); // Mette in n il numero di elementi presenti nella collezione ricevente
    		int m = i.collStr.size();	// Mette in m il numero di elementi presenti nella collezione parametro
    		private Vector vettoreFusione;		// Conterrà l'eventuale fusione delle 2 collezioni
    		int contatore;
    		
    		/* Se la prima stringa contenuta nella collezione referenziata dal parametro contiene completamente l'ultima stringa
    		   contenuta nella collezione ricevente */
    		if(i.collStr[1].contains(this.collStr[n])){
    			vettoreFusione = new Vector();				// Crea il vettore che conterrà la fusione delle due collezioni
    			
    			for(contatore=0; contatore<=n; contatore++) 	// Copia gli elementi della prima collezione in vettoreFusione
    				vettoreFusione.addElement(this.collStr[contatore]);
    				
    			for(contatore=0; contatore<=m; contatore++)		// Copia gli elementi della seconda collezione in vettoreFusione
    				vettoreFusione.addElement(i.collStr[contatore]);
    		}
    		
    		// Se invece non è possibile eseguire la concatenazione	solleva un'eccezione
    		else throw new CollezioneParametroNonValidaExcepion();
    		
    		return vettoreFusione;		// Ritorna al chiamante il vettore che contiene la fusione delle due collezioni
    	}
    	
    	/** Metodo get(i):
    		EFFETS: Accede in lettura in maniera posizionale agli elementi della collezione
    		REQUIRES: La collezione non deve essere vuota
    		@param: Un valore intero che rappresenta la posizione a cui voglio accedere nella collezione
    		@return Un valore String che rappresenta la stringa a cui voglio accede
    		Non modificando la collezione rispetta l'invariante di rappresentazione */
    		
    	public String get(int i){
    		if(i >= collStr.size())		// Se si tenta di accedere ad una locazione più grande della dimensione della collezione
    			throw FuoriDallaCollezioneException();		// Lancia un'eccezione
    		
    		else return collStr.elementAt(i);		// Altrimenti restituisci la stringa in posizione i
    	}
    }
    Gli errori che mi da il compilatore sono questi:

    C:\Programmi\Crimson Editor\template\esercizi\esami\11-07-07>javac Involucro.java
    Involucro.java:82: illegal start of expression
    private Vector vettoreFusione; // Conterrà l'eventuale fusione delle 2 collezioni
    ^
    Involucro.java:87: illegal start of type
    if(i.collStr[1].contains(this.collStr[n])){
    ^
    Involucro.java:87: ']' expected
    if(i.collStr[1].contains(this.collStr[n])){
    ^
    Involucro.java:87: invalid method declaration; return type required
    if(i.collStr[1].contains(this.collStr[n])){
    ^
    Involucro.java:87: illegal start of type
    if(i.collStr[1].contains(this.collStr[n])){
    ^
    Involucro.java illegal start of type
    else throw new CollezioneParametroNonValidaExcepion();
    ^
    Involucro.java invalid method declaration; return type required
    else throw new CollezioneParametroNonValidaExcepion();
    ^
    Involucro.java:100: illegal start of type
    return vettoreFusione; // Ritorna al chiamante il vettore che contiene la fusione delle due colle
    zioni
    ^
    Involucro.java:100: <identifier> expected
    return vettoreFusione; // Ritorna al chiamante il vettore che contiene la fusione delle due colle
    zioni
    ^
    Involucro.java:110: class, interface, or enum expected
    public String get(int i){
    ^
    Involucro.java:114: class, interface, or enum expected
    else return collStr.elementAt(i); // Altrimenti restituisci la stringa in posizione i
    ^
    Involucro.java:115: class, interface, or enum expected
    }
    ^
    12 errors

    Cosa c'èdi sbagliato?

    Tnx

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto: import java.util.*; visto che usi Vector.
    Poi:
    - private non lo puoi usare con variabili locali. vettoreFusione è una variabile locale.
    - fondi() dichiara di ritornare un Involucro ... ma tu ritorni il vettoreFusione. Ovviamente non va bene! Devi creare una nuova istanza di Involucro che conterrà le stringhe del Involucro 'this' più quelle del Involucro passato come argomento.
    - Nel get() dovresti anche controllare (per completezza) che l'indice non sia negativo.

    Ci sono anche altri svariati errori ... tipo this.collStr[n] ma collStr è un Vector ... non lo puoi "indicizzare" così!

    Insomma ... c'è parecchio da rivedere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Originariamente inviato da andbin
    Innanzitutto: import java.util.*; visto che usi Vector.
    Poi:
    - private non lo puoi usare con variabili locali. vettoreFusione è una variabile locale.
    - fondi() dichiara di ritornare un Involucro ... ma tu ritorni il vettoreFusione. Ovviamente non va bene! Devi creare una nuova istanza di Involucro che conterrà le stringhe del Involucro 'this' più quelle del Involucro passato come argomento.
    - Nel get() dovresti anche controllare (per completezza) che l'indice non sia negativo.

    Ci sono anche altri svariati errori ... tipo this.collStr[n] ma collStr è un Vector ... non lo puoi "indicizzare" così!

    Insomma ... c'è parecchio da rivedere.
    mmm varie cose le ho fatte proprio per distrazione come il this.collStr[n] che nnon sò per quale motivo ad un certo punto ho iniziato a pensare come ero abituato a fare in C anche se sò benissimo che usando i Vector devo usare i metodi forniti da Vector come ho anche fatto altrove doh....

    La cosa più grave credo sia il secondo errore che mi hai fatto notare...a questo punto l'unica soluzione credo sia quella di implementare un altro costruttore per Involucro che prende in input un Vector, gli passo vetttoreFusione, il costruttore controlla che le stringhe all'interno siano valide e costruisce un nuovo oggetto da far poi restituire al metodo fondi(), che ne dici?

    Cmq sviste a parte...secondo te è impostato "decentemente" questo esercizio d'esame o mi posso anche suicidare? sinceramente...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da AndreaNobili
    La cosa più grave credo sia il secondo errore che mi hai fatto notare...a questo punto l'unica soluzione credo sia quella di implementare un altro costruttore per Involucro che prende in input un Vector, gli passo vetttoreFusione, il costruttore controlla che le stringhe all'interno siano valide e costruisce un nuovo oggetto da far poi restituire al metodo fondi(), che ne dici?
    Il costruttore che riceve un Vector sarebbe appropriato ma solo se lo metti privato ... non pubblico.

    Comunque non sarebbe difficile creare un nuovo Vector. Dopo che hai verificato, con quel test descritto nei commenti, che il fondi() sia fattibile, istanzi un nuovo Vector e poi usi addAll() per aggiungere direttamente gli elementi dei due Vector ... quello del 'this' e quello dell'altro.

    Originariamente inviato da AndreaNobili
    Cmq sviste a parte...secondo te è impostato "decentemente" questo esercizio d'esame o mi posso anche suicidare? sinceramente...
    Non è grossa/complicata come classe ... quindi se sistemi bene il tutto direi che può andare bene.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.