Qualcuno può incollare qua la sua soluzione dell'esercitazione di oggi?
( [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;
    }
    
}
Alessandro Antonelli
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).
}
MindFlyer
il Ferrari ha sottolineato che bisogna anche controllare in qualche modo che il parametro che gli viene passato non sia null (lanciando un'eccezione)
Grazie, ho aggiunto l'eccezione.
non ricordo la API ma credo che alla remove della classe vector vada passato l'indice, non il valore.
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.

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.