/**Completare il template della classe generica MultiSet, le cui istanze definiscono
*multi-set di elementi ti tipo E.
*Avendo definito questa classe si potrà ad esempio dichiarare
*MultiSet<String> mset_str = new MultiSet<String>();
*Cos'è un multi-set? Non è altro che un insieme di elementi (di tipo E)
*ognuno con associata una molteplicità (un numero naturale) che indica il numero di
*occorenze (>= 0) dell'elemento nel multi-set.
*Ad esempio il contenuto di un garage potrebbe essere descritto da un multi-set di macchine:
*2 fiat Punto, 3 alfa 147, 4 renault megane, 1 toyota yaris, etc.
*(le macchine non citate hanno molteplicità zero...)
*Nel seguito useremo per gli esempi multi-set di stringhe, e denoteremo un multi-set
*attraverso una somma formale (in cui cioè il simbolo '+' non è da intendersi come
*un vero e proprio operatore): ad esempio il garage di cui sopra sarà descritto da
*2"fiat-punto" + 3"alfa-147" + 4"renault-megane" + 1"toyota-yaris" + ...
*Si potrà utilizzare, se necessario, qualsiasi classe si ritenga opportuno (facente parte
*delle API Java, del package prog, del materiale didattico, etc.).
*La classe potrà inoltre essere definita come sotto-classe di una altra classe (anche
*questa decisione è a completa discrezione dello studente)
*Infine potranno essere eventualmente definite altre classi che si reputino necessarie
*per la realizzazione del progetto, così come potranno essere aggiunti alla classe
*MultiSet altri metodi ausiliari (dichiarati private)
*/
class MultiSet<E>
{
/**Costruttore senza parametri: costruisce un multi-set vuoto
*/
public MultiSet ()
{
}
/**Costruttore con parametro: costruisce un multi-set corrispondente a list,
*dove list è (un riferimento ad) un oggetto di una qualsiasi classe che implementi
*l'interfaccia Iterable del package java.lang
*se list è un elenco vuoto allora costruisce un multi-set vuoto
*Si ricordi che in generale una classe che implementi Iterable (ad esempio la classe
*Sequenza del package prog.utili) può prevedere la ripetizione di elementi
*(cosa di cui si dovrà tenere conto nella costruzione del multi-set)
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se list è uguale a null
*/
public MultiSet (Iterable<E> list)
{
}
/**Costruttore con parametro: costruisce un multi-set identico all'multi-set copy
*ATTENZIONE: il multi-set che si sta costruendo e copy dovranno essere a tutti gli effetti
*indipendenti e separati.
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se copy è uguale a null
*/
public MultiSet (MultiSet<E> copy)
{
}
/**Assegna la molteplicità di elemento nel multi-set uguale a mult
*(ricordiamo che un elemento non presente è come se avesse molteplicità 0)
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se elemento è uguale a null o se mult < 0
*/
public void setMult (E elemento, int mult)
{
}
/**Ritorna la molteplicità di elemento nel multi-set (ricordiamo che un elemento non
*presente nel multi-set ha molteplicità 0)
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se elemento è uguale a null
*/
public int mult (E elemento)
{
}
/**Verifica che il multi-set sia vuoto
*/
public boolean empty ()
{
}
/**Ritorna un nuovo multi-set, risultato della somma del multi-set corrente
*e other (che devono rimanere invariati)
*ricordiamo che la somma fra multi-set si esegue sommando le molteplicità di
*elementi corrispondenti: ad esempio la somma fra
*2"fiat-punto" + 3"alfa-147" e 1"fiat-punto" + 2"alfa-147" + 1"fiat-panda"
*è uguale a: 3"fiat-punto" + 5"alfa-147" + 1"fiat-panda"
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se other è uguale a null
*/
public MultiSet<E> sum (MultiSet<E> other)
{
}
/**Ritorna un nuovo multi-set, risultato della intersezione del multi-set corrente
*e other (che devono rimanere invariati)
*ricordiamo che l'intersezione fra multi-set si esegue considerando il minimo tra
*le molteplicità di elementi corrispondenti: ad esempio l'intersezione fra
*2"fiat-punto" + 3"alfa-147" e 1"fiat-punto" + 2"alfa-147" + 1"fiat-panda"
*è uguale a: 1"fiat-punto" + 2"alfa-147"
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se other è uguale a null
*/
public MultiSet<E> intersection (MultiSet<E> other)
{
}
/**Ritorna un nuovo multi-set, risultato della differenza del multi-set corrente
*e other (che devono rimanere invariati)
*ricordiamo che la differenza fra due multi-set si esegue assegnando come molteplicità
*di un elemento nel multi-set risultato il massimo fra 0 e la differenza tra le
*molteplicità di elementi corrispondenti del primo (cioè del multi-set corrente)
*e del secondo; ad esempio la differenza fra:
*2"fiat-punto" + 3"alfa-147" e 1"fiat-punto" + 2"alfa-147" + 1"fiat-panda"
*è uguale a: 1"fiat-punto" + 1"alfa-147"
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se other è uguale a null
*/
public MultiSet<E> diff (MultiSet<E> other)
{
}
/**Ritorna il numero di elementi del multi-set corrente, tenendo conto delle
*ripetizioni (cioè delle molteplicità): ad esempio la cardinalità di
*1"rosso" + 2"giallo" è 3
*/
public int card ()
{
}
/**Ritorna una rappresentazione testuale dell'multi-set corrente: il tipo di
*rappresentazione è a discrezione dello studente
*si tenga conto del possibile caso di multi-set vuoto
*/
public String toString ()
{
}
/**Verifica che il multi-set corrente sia uguale ad other
*Solleva l'eccezione non-controllata IllegalArgumentException del package java.lang
*se other è uguale a null
*/
public boolean equals (MultiSet<E> other)
{
}
/**Ritorna un oggetto di tipo Iterable corrispondente al multi-set corrente,
*(suggerimento: si rammenti che, ad esempio, la classe Sequenza del package
*prog.utili implementa l'interfaccia Iterable)
*/
public Iterable<E> toIterable ()
{
}
/**Ritorna un oggetto di tipo Iterable corrispondente al multi-set corrente:
*se il parametro as_set è true allora non tiene conto di eventuali ripetizioni,
*altrimenti funziona come il metodo precedente
*/
public Iterable<E> toIterable (boolean as_set)
{
}
/** Deve permettere al docente di eseguire un test interattivo della classe
*attraverso cui sia possibile provare tutti i metodi-costruttori implementati
*il docente deve poter scegliere il tipo parametro E della classe tra 2-3 alternative
*(ad esempio String, Integer, ...)
*Si segnali attraverso un opportuno messaggio gli eventuali metodi-costruttori
*che non si è stati in grado di implementare (si ricordi comunque che come
*prerequisito indispensabile la classe dovrà essere compilabile, quindi si dia
*una implementazione fittizia dei metodi non definiti)
*/
public static void main (String args[])
{
}//main
} //fine MultiSet