/** contenitore di oggetti comparabili @author Adriano Luchetta @version 8-Nov-2003 @version 27-Nov-2004 */ import java.util.NoSuchElementException; public class ContenitoreOrdinato implements Container { private Comparable[] c; private int cSize; public ContenitoreOrdinato() { c = new Comparable[1]; makeEmpty(); } /** @return true se l'array e' vuoto, false altrimenti */ public boolean isEmpty() { return cSize == 0; } /** rende vuoto il contenitore */ public void makeEmpty() { cSize = 0; } /** @return il numero di elementi nel contenitore */ public int size() { return cSize; } /** Aggiunge un elemento comparabile, ridimensionando l'array se necessario. L'elemento sia inserito in coda all'array e successivamente l'array sia ordinato. Attenzione, prima dell'inserimento l'array e' ordinato! Andamento asintotico O(n). @param compObj oggetto comparabile da aggiungere */ public void aggiungi(Comparable compObj) { //ridimensionamento se necessario if (cSize == c.length) c = resize(c, 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++; } /** 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 Object togliMax() throws NoSuchElementException { if (isEmpty()) throw new NoSuchElementException("contenitore vuoto"); Object obj = c[cSize - 1]; c[cSize - 1] = null; // garbage collector cSize--; return obj; } private Comparable[] resize(Comparable[] oldAr, int newLength) { Comparable[] newAr = new Comparable[newLength]; int minLength = oldAr.length; if (newLength < oldAr.length) minLength = newLength; for (int i = 0; i < minLength; i++) newAr[i] = oldAr[i]; return newAr; } }