/**
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();
}
}