/** contenitore di oggetti di classe Studenti.java @author Adriano Luchetta @version 8-Nov-2003 @version 20-Nov-2004 @version 20-Nov-2004 java 5.0 */ import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; import java.util.NoSuchElementException; public class ContenitoreOrdinatoStudenti implements Container { private Studente[] studente; private int studenteSize; /** inizializza un archivio vuoto */ public ContenitoreOrdinatoStudenti() { studente = new Studente[1]; makeEmpty(); } /** inizializza un archivio, inserendo dati acquisiti da file
i dati sono inseriti mantenendo ordinato l'archivio @param filename nome del file da cui vengono acquisiti i dati @throws IOException */ public ContenitoreOrdinatoStudenti(String filename) throws IOException { this(); Scanner in = new Scanner(new FileReader(filename)); int contatoreDiRiga = 0; while (in.hasNextLine()) { contatoreDiRiga++; String riga = in.nextLine(); Scanner tok = new Scanner(riga); tok.useDelimiter("[:]+"); try { String nome = tok.next(); int matricola = tok.nextInt(); aggiungi(nome, matricola); } catch (NoSuchElementException e) { System.out.println("riga " + contatoreDiRiga + " errata: " + riga); } } in.close(); } /** verifica se il contenitore è vuoto.
Andamento asintotico O(1) @return true se l'array e' vuoto, false altrimenti */ public boolean isEmpty() { return studenteSize == 0; } /** rende vuoto il contenitore.
Andamento asintotico O(1) */ public void makeEmpty() { studenteSize = 0; } /** ritorna il numero di elementi presenti nel contenitore @return il numero di elementi */ public int size() { return studenteSize; } /** Aggiunge un oggetto, ridimensionando l'array se richiesto. Attenzione, prima dell'inserimento l'array e' ordinato! Andamento asintotico O(n). @param nome nome dello studente da aggiungere @param matr numero di matricola dello studente da aggiungere */ public void aggiungi(String nome, int matr) { //ridimensionamento se necessario if (studenteSize == studente.length) studente = resize(studente, 2 * studente.length); //nuovo studente Studente tmpStudente = new Studente(nome, matr); // ricerca indice i per inserimento ordinato e spostamento a destra // ciclo interno dell'algoritmo di ordinamento per inserimento! int i; for (i = studenteSize; i > 0 && tmpStudente.compareTo(studente[i - 1]) < 0; i--) studente[i] = studente[i-1]; //inserimento studente studente[i] = tmpStudente; studenteSize++; } /** ritorna il valore massimo del contenitore (massimo nel senso di compareTo()), cancellandolo dal contenitore.
Andamento asintotico O(1). @return il valore massimo @throws NoSuchElementException se l'array e' vuoto */ public Studente togliMax() throws NoSuchElementException { if (isEmpty()) throw new NoSuchElementException("archivio vuoto"); Studente tmpStudente = studente[studenteSize - 1]; studente[studenteSize - 1] = null; // garbage collector studenteSize--; return tmpStudente; } private Studente[] resize(Studente[] oldAr, int newLength) { Studente[] newAr = new Studente[newLength]; int minLength = Math.min(oldAr.length, newLength); for (int i = 0; i < minLength; i++) newAr[i] = oldAr[i]; return newAr; } public static void main(String[] args) throws IOException { if (args.length < 2) { System.out.println("uso: $java Archivio nomeInputFile nomeOutputFile"); return; } ContenitoreOrdinatoStudenti archivio = new ContenitoreOrdinatoStudenti(args[0]); PrintWriter writer = new PrintWriter(args[1]); while (!archivio.isEmpty()) writer.println(archivio.togliMax()); writer.close(); } }