CONFRONTARE OGGETTI GENERICI

di il
9 risposte

CONFRONTARE OGGETTI GENERICI

Ciao a tutti, ho un dubbio che non riesco a risolvere/chiarire.

Allora io ho implementato una collezione di oggetti generici chiamata Set<E>.
Però, se io volessi estrarre il minimo o il massimo da questa collezione, in che modo posso farlo?
Non ho alcuna informazione sul tipo degli oggetti che saranno presenti nella collezione quindi dovrei fare una ricerca su un tipo di dato generico...c'è un modo per farlo?
Grazie per l'aiuto, sono ancora un po inesperto con java.

9 Risposte

  • Re: CONFRONTARE OGGETTI GENERICI

    Per avere il minimo ed il massimo vuol dire che tra gli oggetti c'e' un ordine!

    Se esiste un ordine, NON PUO' ESSERE un Object, ma al minimo deve essere un java.lang.Comparable

    Quindi, al minimo, il tuo oggetto deve implementare l'interfaccia Comparable.

    Non solo, ma il tuo Set deve essere un TreeSet
  • Re: CONFRONTARE OGGETTI GENERICI

    Scusa migliorabile, forse mi sono espresso male dicendo "collezione di oggetti generici".
    Ti faccio un esempio per farti capire cosa intendo precisamente:
    mettiamo che la collezione la implementi rappresentandola con un Vector<E> vet.
    Ora, vet potrà essere un Vector<Integer> o un Vector<String> e così via...
    La mia domanda è c'è un modo per implementare un metodo che mi faccia confronti su Vector<E>, senza sapere a priori da quale tipo di dato sarà riempita la struttura?
  • Re: CONFRONTARE OGGETTI GENERICI

    riccac ha scritto:


    La mia domanda è c'è un modo per implementare un metodo che mi faccia confronti su Vector<E>, senza sapere a priori da quale tipo di dato sarà riempita la struttura?
    Certo ma devi presupporre che gli oggetti siano "comparabili" (e oltretutto, importante, mutualmente comparabili tra di loro).

    Ora, o imponi a priori che la parametrizzazione concreta sia SOLO di un tipo che è Comparable ... oppure fai dei cast espliciti a Comparable ... sperando che non ci siano problemi.

    Questo se devi, per qualche motivo (es. "didattico"), farlo tu a mano. Altrimenti nota che la classe java.util.Collections contiene già i metodi min/max. Vedi javadoc.
  • Re: CONFRONTARE OGGETTI GENERICI

    Grazie della spiegazione..sto iniziando a capirci qualcosa di più.
    Devo fare questa cosa per motivi didattici, ma non ho alcuna limitazione ai metodi delle altre classi che posso o non posso usare.

    Però vorrei capire come implementarlo "a mano", nel caso mi dovesse servire in futuro.
    Mi puoi dare una mano spiegandomi come si fa?
  • Re: CONFRONTARE OGGETTI GENERICI

    riccac ha scritto:


    Grazie della spiegazione..sto iniziando a capirci qualcosa di più.
    Devo fare questa cosa per motivi didattici, ma non ho alcuna limitazione ai metodi delle altre classi che posso o non posso usare.

    Però vorrei capire come implementarlo "a mano", nel caso mi dovesse servire in futuro.
    Mi puoi dare una mano spiegandomi come si fa?
    Puoi partire con la creazione di un metodo simile a quello in Collections. il max l'hanno definito come

    public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

    Tu puoi anche togliere quel Object & (l'hanno dovuto aggiungere per compatibilità del byte-code all'indietro).
    All'interno del metodo, sei certo (perlomeno dalla parametrizzazione) che gli elementi sono Comparable, quindi hanno un compareTo. Ti basta tenere l'elemento massimo "corrente" e poi fare un confronto man mano che scansioni la collezione, prendendo quello che man mano risulta maggiore. Tutto qui.

    Prova.
  • Re: CONFRONTARE OGGETTI GENERICI

    Ok grazie mille andbin...ho capito come si fa!
    due cose:
    1)Quali sono tipi che non si possono comparare?

    2)Il metodo compareTo mi assicura anche che i due oggetti comparati siano dello stesso tipo no?
    cioè non è che mi fa risultare "corretto" il confronto tra un Integer e una String anche se entrambi i tipi sono comparable?
  • Re: CONFRONTARE OGGETTI GENERICI

    E poi comunque dovrei implementarmi da solo il metodo compareTo e ritorniamo sempre al punto di partenza no?, cioè come faccio a sapere che tipo di dati comporranno la collezione per creare un compareTo che funzionerà di conseguenza?
  • Re: CONFRONTARE OGGETTI GENERICI

    riccac ha scritto:


    1)Quali sono tipi che non si possono comparare?
    Qualunque classe è comparabile SE offre una qualche API apposita per la comparazione dei suoi oggetti. Se ti faccio una classe Persona con dei metodi es. isMinore, isMaggiore ecc... oppure un singolo metodo comparaPersona(Persona altra), allora gli oggetti Persona li puoi comparare. Ma non c'entra nulla con Comparable/Comparator, perché la API è differente.

    Comparable/Comparator sono state fatte proprio per "standardizzare" il principio della comparazione tra gli oggetti. Altrimenti sarebbe stato il caos ... ognuno faceva e metteva i metodi di comparazione che gli pareva.

    riccac ha scritto:


    2)Il metodo compareTo mi assicura anche che i due oggetti comparati siano dello stesso tipo no?
    No, di per sé no. String è Comparable<String> mentre Integer è Comparable<Integer>. Entrambi sono Comparable ma NON sono comparabili tra di loro.

    riccac ha scritto:


    cioè non è che mi fa risultare "corretto" il confronto tra un Integer e una String anche se entrambi i tipi sono comparable?
    Se due oggetti NON sono mutualmente comparabili tra di loro, da qualche parte si schianterà con un bel ClassCastException.
    Prima dell'avvento dei generics, il compareTo aveva come parametro un Object e tipicamente si doveva fare es.:
    public class Persona implements Comparable {    // pre Java 5
       .....
        public int compareTo(Object altroOggetto) {
            Persona altraPersona = (Persona) altroOggetto;
            // .... confronta this con altraPersona 
        }
    }
    C'è praticamente sempre di mezzo un cast, che fallisce ovviamente se viene passato un oggetto che non è quello aspettato.

    riccac ha scritto:


    E poi comunque dovrei implementarmi da solo il metodo compareTo e ritorniamo sempre al punto di partenza no?
    Per il min/max non devi implementare il compareTo ma semplicemente invocare quello che è già implementato negli oggetti della collezione da esaminare.

    riccac ha scritto:


    cioè come faccio a sapere che tipo di dati comporranno la collezione per creare un compareTo che funzionerà di conseguenza?
    Se fai un metodo es.

    public static <T extends Comparable<? super T>> T valoreMassimo(Collection<? extends T> coll)

    Il tipo usabile all'interno del metodo è T. Puoi avere una variabile 'massimo' di tipo T. Iterando sulla collezione hai dei T ... che hanno compareTo (perché Comparable, già imposto dal bound nella parametrizzazione).
  • Re: CONFRONTARE OGGETTI GENERICI

    Grazie ancora andbin...ora non ho il pc sottomano....domani provo e ti faccio sapere!
    mi hai dato una grossa mano!
Devi accedere o registrarti per scrivere nel forum
9 risposte