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

    [JAVA] Esercizio d'esame...problema a capire l'inizializzazione di matrici, helpme

    Ciao,
    stò studiando per un esame che avrò tra poghi giorni :muro: :muro: ed ho qualche problema con la soluzione proposta in classe dal docente.

    Il testo dice:
    Si richiede il progetto di un dizionario, ossia un'insieme di associazionei, dove ogni associazione è del tipo PAROLA-TRADUZIONE e sia PAROLA che TRADUZIONE sono stringhe costituite da caratteri alfabetici minuscoli.
    E' richiesta l'implementazione del solo operatore traduci() che data una PAROLA restituisce la sua TRADUZIONE.

    In classe è stato risolto così:

    codice:
    /** TIPO ASTRATTO DI DATO:
    	
    	V = {{<p,t>: p ^ t sono stringhe costituite da caratteri alfabetici minuscoli} *NB: Si tratta di un insieme di insiemi
    	perchè voglio rappresentare una collezione di associazioni parola-traduzione.
    	
    	O = { 1) traduci: Data una parola p, se p € Dizionario restituisce la traduzione t
    	
    	C = 0 (non ci sono costanti significative */
    	
    public class Dizionario{
    	
    	private string [][] d;		// Rappresendo le associazioni parola-traduzione mediante una matrice quadrata
    	
    	/** REQUIRES: Il parametro deve essere un array bidimensionale di n righe e due colonne, interamente popolato da
    				  stringhe di caratteri minuscoli */
    				  
    	public Dizionario(String[][] x){	// COSTRUTTORE
    		int i,j;
    		
    		d = new String[x.length];		// Crea un array di stringhe lungo come x (numero righe)
    		
    		for(i=0; i<x.length; i++){
    			if(x[i].length != 2) throw new FailureException();
    			
    			d[i] = new String[2];
    			
    			for(j=0; j<2; j++){
    				if(corretto(x[i,j])
    					d[i][j] = x[i][j];
    				else throw new FailureException;
    			}
    		}
    	}
    	
    	/** EFFECTS: Restituisce la traduzione dell'oggetto ricevente
    		@param: il riferimento ad una oggetto di tipo String
    		@return: il riferimento ad un oggetto di tipo String */
    		
    	public String traduci(String p){
    		int i;
    		Strint ris = null;
    		
    		for(i=0; i<d.length; i++)
    			if(d[i][0] equals(p))
    				ris = d[i][1];
    		
    		return ris;
    	}
    }
    Praticamente il dizionario viene semplicemente gestito tramite una matrice bidimensionali di n righe e sole due colonne: la prima colonna di ogni rig conterrà una PAROLA e la seconda colonna conterrà la sua TRADUZIONE. Il metodo traduci() è molto semplice...

    La cosa che mi crea qualche problema è il costruttore...praticamente prende come parametro una matrice di stringhe e dentro al costruttore viene allocata un'altra matrice di stringhe nel quale viene copiato il parametro...solo che non capisco come lo faccia...

    Venendo da C mi pare differente (anche se non tocco C da quasi un annetto)...mi potete illuminare un pochino su cosa sta fecendo esattamente?

    Grazie
    Andrea

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

    Re: [JAVA] Esercizio d'esame...problema a capire l'inizializzazione di matrici, helpme

    Originariamente inviato da AndreaNobili
    codice:
    	private string [][] d;		// Rappresendo le associazioni parola-traduzione 		
    		d = new String[x.length];		// Crea un array di stringhe lungo come x (numero righe)
    Già qui è sbagliato di brutto. Se 'd' è di tipo String[][] (bidimensionale), non puoi assegnarci un array String[]!!
    Nemmeno il resto ovviamente "sta in piedi", visto questo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    mmm infatti mi puzzava pure a me sta cosa trovata sugli appunti...

    Allora come posso fare a:

    Creare una nuova matrice di dimensioni uguali a quella ricevuta come parametr
    Copiarci tutti gli elementi presenti nella matrice parametro dentro

    Grazie
    Andrea

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da AndreaNobili
    Creare una nuova matrice di dimensioni uguali a quella ricevuta come parametr
    Copiarci tutti gli elementi presenti nella matrice parametro dentro
    Basterebbe:

    d = new String[x.length][2];

    e chiaramente non devi più fare d[i] = new String[2];
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    Basterebbe:

    d = new String[x.length][2];

    e chiaramente non devi più fare d[i] = new String[2];
    e poi il classico doppio ciclo che copia tutti gli elementi della prima matrice nella seconda? giusto?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da AndreaNobili
    e poi il classico doppio ciclo che copia tutti gli elementi della prima matrice nella seconda? giusto?
    Quello principale sicuramente. Quel for interno che dà 0 e 1 non sarebbe necessario. Vedo che viene fatta una validazione con quel corretto(). Non so cosa fa ma si potrebbe fare un semplice metodo che fa tutto quanto e quindi si potrebbe poi scrivere:

    d[i][0] = valida(x[i][0]);
    d[i][1] = valida(x[i][1]);
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Tipo un giochetto del genere? Posso pure evitare di fare la validazione del fatto che le stringhe siano composte da soli caratteri alfabetici minuscoli in quanto metto una bella clausola REQUIRES e chissene frega...

    codice:
    d = new String[x.length][2];// Costruisco una matrice avente lo stesso numero di righe di x e avente sempre 2 colonne
    		
    		for(i=0; i<x.length; i++){		// Per ogni riga della nuova matrice d
    			d[i][1] = x[i][1];		// Copia il contenuto della prima colonna della i-esima riga nella stessa posizione di d
    			d[i][2] = x[i][2];	   // Copia il contenuto della seconda colonna della i-esima riga nella stessa posizione di d
    		}
    Sarebbe corretta una cosa del genere?

    Grazie
    Andrea

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da AndreaNobili
    Sarebbe corretta una cosa del genere?
    Sì, con l'unica precisazione da fare: gli indici partono da 0, quindi le colonne sono 0 e 1.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Originariamente inviato da andbin
    Sì, con l'unica precisazione da fare: gli indici partono da 0, quindi le colonne sono 0 e 1.
    ah ok...

    Ok...ora però ho qualche altro problema con la seconda parte dell'esame...sigh

    Il testo del secondo esercizio(che si ricollega al primo esercizio) dice:
    codice:
    Problema 2.
    Sia data la classe InsiemeDiFrazioni che rappresenta e gestisce insiemi di frazioni. Della classe
    InsiemeDiFrazioni viene fornita la specifica, descritta come segue:
    public class InsiemeDiFrazioni {
    /** OVERVIEW: implementa un tipo di dati astratto i cui elementi
    appartengono all’insieme V={ {f1, f2, ...., fn}: ogni elemento fi è
    una frazione, cioè, una coppia di interi relativamente primi};
    gli oggetti istanza di questa classe sono mutabili;
    l’insieme vuoto è rappresentabile mediante questa classe.
    */
    /** EFFECTS: crea l’oggetto corrispondente ad un insieme vuoto di frazioni
    */
    public InsiemeDiFrazioni() { .... }
    /** REQUIRES: x != null ed x non contenuto in this
    EFFECTS: inserisce x in this
    MODIFIES: this
    */
    public void inserisci(Frazione x) { .... }
    /** REQUIRES: x != null
    EFFECTS: se x è contenuto in this restituisce true, altrimenti
    restituisce false
    */
    public boolean contiene(Frazione x) { .... }
    /** REQUIRES: this != insieme vuoto
    EFFECTS: restituisce la frazione in this il cui valore è più vicino ad
    x
    */
    public Object get(double x) { .... }
    /** REQUIRES: x != null e x this != insieme vuoto
    EFFECTS: rimuove x da this se x è contenuto in this
    MODIFIES: this
    */
    public void rimuovi(Frazione x) { .... }
    public String toString() { .... }
    }
    Si consideri, infine, una classe di test per le due classi sopra descritte che contenga, oltre al metodo main, il metodo
    getFirst che prende come parametro, indifferentemente, un InsiemeDiFrazioni o un Dizionario (classe da
    definire al problema 1) e che estrae dalla collezione ricevuta come parametro l’elemento che risulta primo rispetto
    all’ordinamento definito, rispettivamente, nell’insieme delle frazioni e nell’insieme { parola-traduzione}, cioè:
    · un oggetto f1 di tipo Frazione precede un oggetto f2 di tipo Frazione se
    f1.getValore() < f2.getValore()
    dove double getValore() è un metodo definito nella classe Frazione;
    · una coppia parola1-traduzione1 precede una coppia parola2-traduzione2 se parola1 precede
    lessicograficamente parola2.
    Si richiede il progetto e l’implementazione del metodo getFirst e di tutte le entità Java coinvolte.
    Io l'ho pensato così: creo un'interface chiamata CollConMinimo che al suo interno contiene solamente un metodo abstract calcolaMinimo()
    Poi creo altre due classi: una classe che chiamo DizionarioConMinimo che estende Dizionario precedentemente definita ed implementa CollConMinimo. Ed un'altra classe chiamata InsiemediFrazioniConMinimo che sempre estende la classe InsiemeDiFrazioni di cui mi è stata fornita la specifica ed implementa l''interfaccia CollConMinimo.

    Per DizionarioConMinimo dovrebbe bastare questo codice, l'unica cosa è che dovrei implementare il metodo get nella classe Dizionario ma vabbè quello è un attimo:

    codice:
    public class DizionarioConMinimo extends Dizionario implements CollConMinimo{		// Ereditarietà multipla
    
    	public DizionarioConMinimo(String[][] x){
    		super(x);			// Invoca il costruttore della classe padre Dizionario passandogli la matrice di stringhe x
    	}
    	
    	public Object calcolaMinimo(){
    		
    		int i = 1;
    		boolean b = true;
    		String s;
    		
    		try{
    			s = get(0)
    		}catch(IndiceErratoException e){}
    		
    		while(b){		// Finchè b è true
    			try{		// Prova ad eseguire
    				if(i.get(i).compare(s) < 0)	// Se l'i-esima stringa precede lessicograficamente la stringa contenuta in s
    					s = get(i);				// Metti la stringa all'i-esimo posto in s
    				}catch(IndiceErratoException e){b = false;}	// Quando viene sollevata l'eccezione imposta b a false per terminare il ciclo
    				
    			i++;		// Incrementa i per passare all'elemento successivo
    		}
    		
    		return s;		// Restituisci la stringa calcolata
    	}
    }
    Invece mi impippo nello scrivere il metodo calcolaMinimo per InsiemeDiFrazioniConMinimo in quanto dalla specifica non ho metodi per accedere agli oggetti della collezione di frazioni...qualche idea?

    Poi vabbè per la classe di Test richiesta posso fare

    codice:
    public class Test{
           public Object getFirst(CollConMinimo c){
                      return c.calcolaMin();
           }
    }
    Mi date una mano?

    Tnx

  10. #10
    UP VVoVe:

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.