/** contenitore di oggetti. Si possono ordinare solo oggetti di classi che realizzano l'interfaccia java.lang.Comparable. @author Adriano Luchetta @version 8-Nov-2003 @version 27-Nov-2004 */ import java.util.NoSuchElementException; public class ContenitoreOrdinabileObj implements Container { private Object[] obj; private int objSize; public ContenitoreOrdinabileObj() { obj = new Object[1]; makeEmpty(); } /** @return true se l'array e' vuoto, false altrimenti */ public boolean isEmpty() { return objSize == 0; } /** rende vuoto il contenitore */ public void makeEmpty() { objSize = 0; } /** @return il numero di elementi nel contenitore */ public int size() { return objSize; } /** Aggiunge un elemento ridimensionando l'array se necessario. L'elemento e' inserito in coda all'array. Andamento asintotico medio O(1). @param object oggetto da aggiungere */ public void aggiungi(Object object) { //ridimensionamento se necessario if (objSize == obj.length) obj = resize(obj, 2 * obj.length); //inserimento oggetto obj[objSize++] = object; } /** cancella e ritorna l'ultimo elemento inserito nel contenitore. Andamento asintotico O(1). @return l'ultimo elemento inserito nel contenitore @throws NoSuchElementException se l'array e' vuoto */ public Object togliUltimo() throws NoSuchElementException { if (isEmpty()) throw new NoSuchElementException("obj vuoto"); Object tmpObj = obj[objSize - 1]; obj[objSize - 1] = null; objSize--; return tmpObj; } /** ordina l'archivio usando la classe OrdinatorePerFusione */ public void ordina() { // ridimensionamento per usare il metodo mergesort operante su array completi obj = resize(obj, objSize); Comparable[] compObj = (Comparable[]) obj; ArrayAlgorithms.mergesort(compObj); } private Object[] resize(Object[] oldAr, int newLength) { Object[] newAr = new Object[newLength]; int minLength = oldAr.length; if (newLength < oldAr.length) minLength = newLength; for (int i = 0; i < minLength; i++) newAr[i] = oldAr[i]; return newAr; } }