Soluzione 7.3

La classe SortedContainer (piu` sotto la classe SortedContainerTester).
Questa classe e` un prototipo di un contenitore di dati ordinabili realizzato tramite array riempiti solo in parte
import java.util.NoSuchElementException;

public class SortedContainer implements Container
{
    public SortedContainer()
    {   c = new Comparable[1];
        makeEmpty();
    }
   
    /*
        verifica se il contenitore e' vuoto
        restituisce true se il contenitore e' vuoto, false altrimenti
    */
    public boolean isEmpty()
    {   return cSize == 0; }

    /*
        rende vuoto il contenitore
    */
    public void makeEmpty()
    {   cSize = 0; }
   
    /*
        Aggiunge l'elemento compObj, ridimensionando l'array se necessario.
        L'elemento viene inserito in coda all'array e successivamente l'array
        viene ordinato. Andamento asintotico O(n) (prima dell'inserimento 
        l'array e' ordinato!)
    */
    public void add(Comparable compObj)
    {
        //ridimensionamento se necessario
        if (cSize == c.length)
            c = resize(2 * c.length);
        // ricerca indice i per inserimento ordinato e spostamento a destra
        // ciclo interno dell'algoritmo di ordinamento per inserimento!
        int i;
        for (i = cSize; i > 0 && compObj.compareTo(c[i - 1]) < 0; i--)
            c[i] = c[i-1];
        //inserimento oggetto
        c[i] = compObj;
        cSize++;
    }
    private Comparable[] resize(int newLength)
    {   Comparable[] newAr = new Comparable[newLength];
        int minLength = c.length;
        if (newLength < c.length)
            minLength = newLength;
        for (int i = 0; i < minLength; i++)
            newAr[i] = c[i];
        return newAr;
    }

    /*
        restituisce il valore massimo del contenitore (massimo nel senso 
        definito dal metodo compareTo()), e lo cancella dal contenitore. 
        Andamento asintotico O(1).
        Lancia NoSuchElementException se l'array e' vuoto
    */
    public Comparable removeMax() throws NoSuchElementException
    {   if (isEmpty())  throw new NoSuchElementException("contenitore vuoto");
        Comparable obj = c[cSize - 1];
        cSize--;
        return obj;
    }

    private Comparable[] c;
    private int cSize;
}


La classe SortedContainerTester.
import java.io.*;

import java.util.Scanner;
import java.util.NoSuchElementException;

public class SortedContainerTester
{   public static void main(String[] args) throws IOException
    {   if (args.length < 2)
        { System.out.println("uso: $java SortedContainerTester inFile OutFile");
          System.exit(1);
        }

        SortedContainer archivio = new SortedContainer();
        Scanner in = new Scanner(new FileReader(args[0]));

        int linecount = 0;
        String line = "";
        while (in.hasNextLine())
        {   linecount++;
            line = in.nextLine();
            Scanner linescan = new Scanner(line);
            linescan.useDelimiter(":");
            try
            {   String nome = linescan.next();
                int matricola = Integer.parseInt(linescan.next());
                archivio.add(new Student(nome, matricola));
            }
            catch (NoSuchElementException e)
            {  System.out.println("riga " + linecount + " errata: " + line); }
            catch (NumberFormatException e)
            {  System.out.println("riga " + linecount + " errata: " + line); }
        }
        in.close();

        PrintWriter writer = new PrintWriter(args[1]);
        while (!archivio.isEmpty())
            writer.println(archivio.removeMax());
        writer.close();
    }
}