( [url=http://www.di.unipi.it/~giangi/CORSI/PR2/LEZIONI2015/Esercitazione2.html]http://www.di.unipi.it/~giangi/CORSI/PR2/LEZIONI2015/Esercitazione2.html[/url] )
MindFlyer
Codice: Seleziona tutto
import java.util.*;
public class VectorIntegerCollection implements IntegerCollection{
private Vector<Integer> v;
public VectorIntegerCollection(){
v = new Vector<Integer>();
}
public int occurrences(Integer elem) throws NullPointerException{
int n = 0;
if(elem == null) throw new NullPointerException();
for(int i = 0; i < v.size(); i++)
if(v.elementAt(i).equals(elem)) n++;
return n;
}
public int size(){
return v.size();
}
public void insert(Integer elem) throws NullPointerException{
if(elem == null) throw new NullPointerException();
v.addElement(elem);
}
public Integer extractMax() throws NoSuchElementException{
Integer max = v.firstElement(); // may throw NoSuchElementException
for(int i = 1; i < v.size(); i++)
if(v.elementAt(i).compareTo(max) > 0)
max = v.elementAt(i);
v.remove(max);
return max;
}
}
Mi pare che a lezione sia stato fatto così, aggiungo solo che per i metodi occurrencies ed insert il Ferrari ha sottolineato che bisogna anche controllare in qualche modo che il parametro che gli viene passato non sia null (lanciando un'eccezione), per una questione di programmazione difensiva. Altra stupidaggine: non ricordo la API ma credo che alla remove della classe vector vada passato l'indice, non il valore.
Il punto 1 io lo avevo fatto così, mi pare che più o meno fosse quello che voleva ma non vi assicuro sia perfetto:
Codice: Seleziona tutto
public interface IntegerCollection {
// OVERVIEW: IntegerCollection si usa per rappresentare una collezione mutabile di oggetti di tipo Integer
public int occurrences(Integer elem);
//REQUIRES: elem deve essere diverso da null
//EFFECTS: se elem è contenuto nella collezione restituisce il conteggio delle occorrenze; altrimenti restituisce 0
public int size( );
//REQUIRES: niente
//EFFECTS: restituisce il numero di elementi nella collezione (0 se vuota)
public void insert(Integer elem);
//REQUIRES: elem deve essere diverso da null
//EFFECTS: l'elemento elem diventa parte della collezione
public Integer extractMax( );
//REQUIRES: la collezione non è vuota (size > 0)
//EFFECTS: restituisce ed elimina dalla collezione l'elemento massimo (se ce n'è più di uno, quello eliminato è uno qualunque).
}
Grazie, ho aggiunto l'eccezione.il Ferrari ha sottolineato che bisogna anche controllare in qualche modo che il parametro che gli viene passato non sia null (lanciando un'eccezione)
Si può passare sia l'indice che un valore. Nel secondo caso viene rimossa la prima occorrenza di quel valore. Sarebbe più efficiente ricordarsi l'indice di un elemento massimo durante la scansione, ma ho optato per la brevità del codice a scapito dell'efficienza.non ricordo la API ma credo che alla remove della classe vector vada passato l'indice, non il valore.
Francesco Pieraccini
Scusate, domanda forse stupida, ma non avendolo seguito molto ultimamente mi son perso alcune cose: il codice lo vuole commentato in quel modo con overview, requires ed effects? E c'è un qualche scopo o è solo per renderlo chiaro?
MindFlyer
Essendo commenti, vengono ignorati dal compilatore. Servono solo a voi umani, per capire cosa fa una classe senza leggere tutto il sorgente.