Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [JAVA] Multiset

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    5

    [JAVA] Multiset

    Ciao, frequento il primo anno di informatica all'università degli studi.
    Il terzo progettino di quest'anno consiste nel programmare un multiset, solo che non so come fare...
    Il template da utilizzare è il seguente:

    /**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
    Qualcuno ha qualche idea di come possa risolvere questo esercizio?

    Grazie a chiunque mi risponda...

  2. #2
    Come struttura dati interna potresti usare una hash in cui le chiavi sono degli ogegtti di tipo Class o ancora meglio dei nomi (String) di classi (ottenuti tarmite reflection) e i valori sono dei Vector di oggetti di quella classe.In questo modo dovresti essere in grado di implementare ababstanza semplicemente anche i metodi richiesti.
    Ad esempio se il professtore inserisce di seguito due String e 3 Integer, dovrai prima verificare nelal HashTable se la chiave "java.lang.String" (Ottenuta mediante reflection) è già presente, se lo è aggiungi i due nuovi ogegtti String al Vector associato a quella chiave, in caso contrario crei un nuovo Vector, e una nuova associazione nella HashTable con chiave "java.lang.String" e poi fai come nel caso sopra.Idem per gli altri tipi.In questo modo non devi nemmeno limitare il prof ad inserire solo alcuni tipi, puoi inserire qualsiasi tipo di dato purchè si aun Object (cioè non un tipo primitivo).Ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    5
    Mmmmm...
    Non basterebbe semplicemente una coda in cui ogni elemento punta al successivo e fra i campi ha il tipo di oggetto e la sua quantità?

    Poi ho diversi problemi a svolgere questi punti:


    /**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)
    {

    }
    Non so cosa fare qui

    Grazie dell'aiuto

  4. #4
    Originariamente inviato da Bolla
    Mmmmm...
    Non basterebbe semplicemente una coda in cui ogni elemento punta al successivo e fra i campi ha il tipo di oggetto e la sua quantità?

    Poi ho diversi problemi a svolgere questi punti:



    Non so cosa fare qui

    Grazie dell'aiuto
    Effettivamente non avevo capito che la molteplicità dovesse esserr intesa così.Avevo capito che inserendo due integer (con qualunque valore) di seguito avresti dovuto avere due ogegtti distinti salvati nel multiset.Allora cambia tutto.La HashTable te la consiglio comunque però e come valori ci salvi un integer con la molteplicità del tipo invece che un Vector.
    Per quanto riguarda quei due metodi innanzitutto nota che quello senza parametro lo implementi solo richiamando l'altro col parametro a false.
    Sull'implementazone specifica direi che ti conviene seguire il sugegrimento del testo visto che sarà stato il prof a dartelo.Io però non conosco la natura della classe Sequenza quindi devi cavartela tu.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    5
    Ora sorge un altro problema: come si fa a scandire una HashTable?

  6. #6
    Originariamente inviato da Bolla
    Ora sorge un altro problema: come si fa a scandire una HashTable?
    Molto semplice: ci sono i metodi appositi che ritornano delle Enumerations http://java.sun.com/j2se/1.4.2/docs/...Hashtable.html
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361
    Finalmente qualcuno alle prese con il mio stesso problema. Che razza di template ci ha dato da realizzare!!

    Io avevo pensato di usare un array di Occorrenze (una classe del prof che memorizza un campo generico e un contatore)

    (mi pento di aver studiato vb6 alle superiori)

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    5
    Originariamente inviato da trusthat
    Finalmente qualcuno alle prese con il mio stesso problema. Che razza di template ci ha dato da realizzare!!

    Io avevo pensato di usare un array di Occorrenze (una classe del prof che memorizza un campo generico e un contatore)

    (mi pento di aver studiato vb6 alle superiori)
    Ehe... Siamo sulla stessa barca.

    Maledetto Capra e i suoi template!

    Con l'occorrenza non risolvi lo stesso il problema poichè dovresti comunque creare un modo di scandire la miriade di oggetti di tipo Occorrenza. Dovresti usare una coda o qualcosa del genere...

    Almeno tu alle superiori hai fatto vb6! Io ho fatto Turbo Pascal e Assembler...

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361
    azz...saremo i programmatori del 2006

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    5
    Ok, ho superato il problema con le HashTable

    Ora ce n'è un altro

    Come utilizzo il parametro list?

    codice:
    
    /**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)
    {
    
    }
    Essendo Iterable ho provato a scandirlo con list.next ma non funziona...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.