/** Compito del 24-Dic-2001 Il database viene realizzato con un array non ordinato. La chiave del dizionario sia il nome dello studente. @author A. Luchetta @version 28-11-2003 @version 21-Nov-2005 */ public class ScuolaArrayNonOrdinato { // variabili di esemplare private Coppia[] coppia; private int coppiaSize; public ScuolaArrayNonOrdinato() { // partiamo con un elemento coppia = new Coppia[1]; coppiaSize = 0; } /** Aggiunge alla lista interna una nuova istanza di classe studente, verificando che il nome non sia gia' presente, nel qual caso non viene eseguita alcuna azione. Complessita' temporale: caso medio O(n) @param nome nome dello studente */ public void aggiungiStudente(String nome) { // Studente da ricercare Studente studente = new Studente(nome); Coppia nuovaCoppia = new Coppia(nome, studente); for (int i = 0; i < coppiaSize; i++) if (coppia[i].equals(nuovaCoppia)) return; // eventuale ridimensionamento dell'array e inserimento elemento if (coppiaSize == coppia.length) coppia = resize(); coppia[coppiaSize++] = nuovaCoppia; } /** Aggiorna le informazioni interne per riportare che il dato studente ha sostenuto il dato esame col dato voto. Complessita' temporale: caso medio O(n) @param studente nome dello studente @param esame nome dell'esame di cui si inserisce il voto @param voto voto dell'esame */ public void aggiornaCurriculum(String studente, String esame, int voto) { Coppia coppiaDaAggiornare = new Coppia(studente, new Studente(studente)); for (int i = 0; i < coppiaSize; i++) if (coppia[i].equals(coppiaDaAggiornare)) coppia[i].getAttributo().aggiungiEsame(esame, voto); } /** scrive nello standard output la lista degli studenti, il numero di esami sostenuti, e la media dei voti. La lista dovra' essere ordinata nell'ordine della media. Complessita' temporale: e' quella dell'ordinamento: - O(n^2) in caso di ordinamento per selezione o inserimento - O(n log n) in caso di ordinamento per fusione */ public void stampa() { // array di studenti Studente[] lista = toArray(); // Ordinamento tramite classe Ordinatore Ordinatore sorter = new Ordinatore(lista); sorter.ordina(); // stampa degli oggetti di classe studente for (int i = 0; i < lista.length; i++) System.out.println(lista[i]); } // metodo privato per ricavare un array che contiene gli studenti // Complessita' temporale: O(n) private Studente[] toArray() { Studente[] arrayStudenti = new Studente[coppiaSize]; for (int i = 0; i < coppiaSize; i++) arrayStudenti[i] = coppia[i].getAttributo(); return arrayStudenti; } // metodo privato per il ridimensionamento dell'array private Coppia[] resize() { Coppia[] nuovaCoppia = new Coppia[2 * coppia.length]; for (int i = 0; i < coppia.length; i++) nuovaCoppia[i] = coppia[i]; return nuovaCoppia; } // classe privata Coppia private class Coppia { // variabili di esemplare private String chiave; private Studente attributo; // costruttore public Coppia(String ch, Studente att) { chiave = ch; attributo = att; } // metodi accessori public String getChiave() { return chiave; } public Studente getAttributo() { return attributo; } // override del metodo boolean equals(Object obj) della classe Object // due coppie sono uguali se hanno la stessa chiave public boolean equals(Object obj) { Coppia altraCoppia = (Coppia) obj; return chiave.equals(altraCoppia.chiave); } } public static void main(String args[]) { ScuolaArrayNonOrdinato scuola = new ScuolaArrayNonOrdinato(); scuola.aggiungiStudente("Rossi"); scuola.aggiungiStudente("Bianchi"); scuola.aggiungiStudente("Verdi"); scuola.aggiornaCurriculum("Rossi", "Fondamenti di Informatica 1", 23); scuola.aggiornaCurriculum("Rossi", "Matematica A", 19); scuola.aggiornaCurriculum("Rossi", "Fisica 1", 24); scuola.aggiornaCurriculum("Bianchi", "Fondamenti di Informatica 1", 18); scuola.aggiornaCurriculum("Bianchi", "Matematica A", 19); scuola.aggiornaCurriculum("Bianchi", "Fisica 1", 20); scuola.aggiornaCurriculum("Verdi", "Fondamenti di Informatica 1", 30); scuola.aggiornaCurriculum("Verdi", "Matematica A", 30); scuola.aggiornaCurriculum("Verdi", "Fisica 1", 27); scuola.stampa(); } }