/** Compito del 24-Dic-2001 La classe usa un dizionario per memorizzare gli esami con i relativi voti, dove la chiave e' il nome dell'esame e l'attributo il voto. Il dizionario e' realizzato con un array di lunghezza fissa. La classe realizza l'interfaccia Comparable, perche' le istanze dovranno essere ordinabili secondo la media dei voti ottenuti negli esami. La classe riscrive i seguenti metodi della classe Object - boolean equals(Object) - String toString() Due studenti sono considerati uguali se hanno lo stesso nome. @author F. Bombi @version 24-12-2001 */ public class Studente implements Comparable { // costanti private static final int MAX_NUMERO_ESAMI = 30; // variabili di esemplare private String nome; private Coppia[] esame; private int esameSize; //Istanzia un oggetto di classe studente senza alcun esame public Studente(String unNome) { nome = unNome; esameSize = 0; esame = new Coppia[MAX_NUMERO_ESAMI]; } /** Aggiunge alla lista degli esami eseguiti il nuovo esame e il corrispondente voto. Assicura che un esame non compaia piu' di una volta nel dizionario. @param nomeEsame il nome dell'esame @param voto il voto dell'esame */ public void aggiungiEsame(String nomeEsame, int voto) { Coppia nuovoEsame = new Coppia(nomeEsame, voto); // Ricerca nel dizionario for (int i = 0; i < esameSize; i++) { if (esame[i].equals(nuovoEsame)) { // se presente sostituisci con nuovo esame esame[i] = nuovoEsame; return; } } // se non presente aggiungi al dizionario il nuovoEsame esame[esameSize++] = nuovoEsame; } /** Restituisce il voto corrispondente all'esame eseguito. Se l'esame non e' stato sostenuto, restituisce 0. @param nomeEsame nome dell'esame @return il voto dell'esame */ private int voto(String nomeEsame) { // Coppia per ricerca con attributo qualsiasi (ad esempio zero) // l'attributo non viene considerato nella ricerca! Coppia questoEsame = new Coppia(nomeEsame, 0); for (int i = 0; i < esameSize; i++) if (esame[i].equals(questoEsame)) return esame[i].getAttributo(); return 0; } /** Restituisce la media degli esami sostenuti. Se nessun esame e' stato sostenuto, restituisce zero. @return la media dei voti d'esame */ public double media() { if (esameSize == 0) return 0; int somma = 0; for (int i = 0; i < esameSize; i++) somma += esame[i].getAttributo(); // attenzione al forzamento a double per non perdere di precisione return somma / (double) esameSize; } /** Restituisce vero se due studenti hanno lo stesso nome. Override del metodo omologo della classe Object @param obj studente (di classe Object) @return true se hanno lo stesso nome, altrimenti false */ public boolean equals(Object obj) { Studente s = (Studente) obj; return nome.equals(s.nome); } /** comparazione in base alla media dei voti. @param obj studente da comparare */ public int compareTo(Object obj) { // forzamento a Studente Studente s = (Studente) obj; if (media() > s.media()) return 1; else if (media() < s.media()) return -1; else return 0; } /** Restituisce una stringa descrittiva di uno studente nel formato: (visibile in Studente.html):
nome: NOME_STUDENTE
   Elenco degli Esami:
   ESAME1: VOTO1
   ESAME2: VOTO2
   ...
   media = MEDIA

Esempio:
nome: Verdi
   Elenco degli Esami:
   Fondamenti di Informatica 1: 30
   Matematica A: 30
   Fisica 1: 27
   media = 29 */ public String toString() { final String INDENT = " "; // nome String tmpString = "nome: " + nome + "\n"; // elenco esami tmpString += "Elenco degli Esami:\n"; for (int i = 0; i < esameSize; i++) tmpString += INDENT + esame[i] + "\n"; // viene invocato esame[i].toString() tmpString += INDENT + "media = " + media(); return tmpString; } // classe privata private class Coppia { private String chiave; private int attributo; public Coppia(String ch, int att) { chiave = ch; attributo = att; } // metodi accessori public String getChiave() { return chiave; } public int getAttributo() { return attributo; } // due coppie sono uguali se hanno la stessa chiave, indipendentemente dall'attributo public boolean equals(Object obj) { Coppia altraCoppia = (Coppia) obj; return chiave.equals(altraCoppia.chiave); } // stringa che descrive un esame: "NOME_ESAME: VOTO" public String toString() { return chiave + ": " + attributo; } } }