Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: ArrayList

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108

    ArrayList

    Esercizio:
    Implementare una classe pubblica LibrettoEsami che descrive un libretto universitario.Nel nostro caso un libretto e` definito da un insieme di esami sostenuti, quindi con voto diverso da 0, dal totale di CFU accumulati e dalla media dei voti degli esami (media pesata sui CFU, vedi sopra).

    Implementare una classe LibrettoEsami che permetta di:

    * aggiungere un nuovo esame sostenuto da uno studente e restituisce true se
    * l'esame
    e` stato effettivamente aggiunto
    public bolean addEsame(Esame esame)

    Nota: il metodo deve permettere di aggiungere un esame solo se nel
    libretto
    non e` gia` stato registrato un esame con lo stesso nome e se c'e` il
    voto
    (cioe` il voto e` diverso da zero)

    * restituire il numero totale di CFU degli esami sostenuti e la media pesata
    * dei voti,
    public int getTotCFU()
    public double getMedia()

    Il costruttore deve costruire la struttura (array o ArrayList) per registrare
    gli esami, e inizializzare media e totCFU a zero.

    public LibrettoEsami()

    Le variabili di istanza che ci occorrono sono:
    - listaEsami
    - totCFU
    - media (uguale a 0 se non sono stati sostenuti esami).
    ----------------------------------------------------------------------------------------
    Questo è quello che ho prodotto:
    codice:
    public class LibrettoEsami {
    	
    	ArrayList<Esame> listaEsami = new ArrayList<Esame>();
    	int totCFU;
    	double media;
    	
    	public LibrettoEsami(){
    		this.totCFU = 0;
    		this.media = 0;
    	}
    
    	public boolean addEsame(Esame e) {
    		if(listaEsami.contains(e))
    			return false;
    		else{
    			return true;
    		} 	
    	}
    	
    	public int getTotCFU(){
    		for(Esame e : listaEsami)
    			this.totCFU += e.getCFU(); 
    		return totCFU;
    	}
    	
    	public double getMedia(){
    		double sommaPesata = 0, totCFU = 0;
    		for(Esame e : listaEsami){
    			sommaPesata += (e.getCFU() * e.getVoto());
    			totCFU += e.getCFU();
    		}
    		return this.media = sommaPesata / totCFU;	
    	}
    	
    	public String stampa(){
    		String s = "";
    		for(Esame e : listaEsami){
    			if(e.getVoto() != 0)
    				s = e.getNome() + " " + e.getCFU() + " CFU " + e.getVoto();
    			else
    				s = e.getNome() + " " + e.getCFU() + " CFU : esame non sostenuto";
    		}
    		return s;
    	}
    }
    il problema è che se faccio il test anche se metto 2 esami nella lista il metodo addEsame che mi dovrebbe controllare se ci sono esami uguali non mi restituisce nulla o meglio me li stampa tutti anche i doppioni. E' sbagliato il metodo che ho scritto?

  2. #2
    Ma nella classe Esame, hai implementato correttamente il metodo equals e hashcode ?

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    Nella classe Esame mi veniva chiesto di creare solo il metodo equals che è il seguente:
    codice:
    public boolean equals(Esame altro){
    	if(this.nome == altro.nome)
    		return true;
    	else
    		return false;
    }

  4. #4
    usa il metodo equals per comparare due stringhe
    codice:
    this.nome.equals(altro.nome)
    Per quanto riguarda hashcode non è indispensabile in questo caso, ma è sempre bene implementarlo

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    facendo in questo modo mi dà avviamente l'errore dei return:
    codice:
    public boolean addEsame(Esame e) {
    	for(Esame es : listaEsami){
    		if(es.equals(e))
    			return false;
    		else
    			return true;
    	}
    }
    come posso fare?

  6. #6
    io intendevo dentro la classe esame di mettere equals al posto di ==
    codice:
    public boolean equals(Esame altro){
    	if(this.nome == altro.nome)
    		return true;
    	else
    		return false;
    }
    VS
    codice:
    public boolean equals(Esame altro){
    	if(this.nome.equals(altro.nome))
    		return true;
    	else
    		return false;
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    si ok per quello adesso lo modifico.
    Per il problema che ti dicevo come posso risolverlo secondo te?

    public boolean addEsame(Esame e) {
    ..............................
    }

  8. #8
    L'errore su ad esame è proprio perchè il contains va a chiamare l'equals di esame ed effettuando la comparazione con == ritorna sempre false e quindi di conseguenza aggiungi esami duplicati

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    Ti riporto i metodi modificati:
    nella classe Esame
    codice:
    public boolean equals(Esame altro){
    	if(this.nome.equals(altro.nome))
    		return true;
    	else
    		return false;
    }
    nella classe Libretto Esami
    codice:
    public boolean addEsame(Esame e) {
    	if(listaEsami.contains(e))
    		return false;
    	else{
    		listaEsami.add(e);
    		return true;
    	} 	
    }
    e cmq mi riproduce sempre i duplicati

  10. #10
    Leggendo dalla consegna, nel metodo addEsame(Esame e) devi controllare anche che e.voto sia != 0 (o maggiore).
    E poi comunque ArrayList.contains usa il metodo Object.equals per comparare gli oggetti, quindi sbagli perchè fai l'overload del metodo equals, devi farne l'override :

    codice:
    @Override
    public boolean equals(Object altro){
    	if (this.nome.equals(((Esame)altro).nome)))
    		return true;
    	else
    		return false;
    }
    lolide
    Java Programmer

    Informati

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.