Ordinare una lista di oggetti di tipo Libro

di
Anonimizzato21064
il
11 risposte

Ordinare una lista di oggetti di tipo Libro

Ciao a tutti ragazzi,

Sto cercando di imparare la programmazione Java ma ho qualche piccolo dubbio/problemino.

Sto creando un progetto che consiste in una Libreria/Biblioteca, all'interno del progetto ho un solo tipo di oggetto: Libro, con vari attributi tra cui titolo, autore/i e codice ISBN.

Volendo ordinare una lista di oggetti di tipo Libro in ordine alfabetico per titolo prima e per autore poi come devo procedere? Devo scrivere metodi del tipo compareTo all'interno della classe libro o in una classe test che contiene il main?

Grazie della disponibilità

11 Risposte

  • Re: Ordinare una lista di oggetti di tipo Libro

    IDanielZito ha scritto:


    Volendo ordinare una lista di oggetti di tipo Libro in ordine alfabetico per titolo prima e per autore poi come devo procedere? Devo scrivere metodi del tipo compareTo all'interno della classe libro o in una classe test che contiene il main?
    Implementare l'interfaccia Comparable nella classe Libro, se non hai limitazioni in tal senso, è sicuramente comodo e appropriato.

    Ti basta fare l'override in Libro del metodo compareTo, stabilendo il criterio di ordinamento dei libri. Se confronti delle stringhe poi, potresti anche servirti del compareTo di String (partendo dal titolo, passando poi all'autore se i titoli sono uguali etc.).

    Nella classe che contiene il main devi solo effettuare l'ordinamento della lista.
    Se hai una lista di libri e hai implementato Comparable, per l'ordinamento ti basta fare :
    
    Collections.sort (tuaListaDiLibri);
    
    Se vuoi utilizzare più ordinamenti puoi anche passare un Comparator al metodo sort.
  • Re: Ordinare una lista di oggetti di tipo Libro

    Grazie della risposta

    Ho la necessità di fare più ordinamenti, come dicevo prima per titolo poi per voto, nel caso usassi un Comparator (è una interfaccia giusto?) come dovrei usare questa classe? Cosa scrivere all'interno del codice?

    Grazie
  • Re: Ordinare una lista di oggetti di tipo Libro

    IDanielZito ha scritto:


    Ho la necessità di fare più ordinamenti, come dicevo prima per titolo poi per voto, nel caso usassi un Comparator (è una interfaccia giusto?) come dovrei usare questa classe? Cosa scrivere all'interno del codice?
    In generale:

    - Comparable va implementato nella classe degli oggetti da comparare (nel tuo caso Libro, quindi è Libro che farebbe implements Comparable<Libro> ). Di criterio con Comparable quindi ce ne può essere uno solo (dovrebbe essere l'ordinamento "naturale" degli oggetti)

    - Comparator va implementato in classi separate dalla classe degli oggetti da comparare. Quindi ne puoi avere N, quanti ne vuoi.

    Es.

    public class LibriPerDescrizioneComparator implements Comparator<Libro> { .... }

    public class LibriPerDataPubblicazioneComparator implements Comparator<Libro> { .... }

    ecc... (dai alle classi i nomi che vuoi, ovviamente)

    Dentro implementi il compare, che grazie all'uso della parametrizzazione <Libro> ha la forma:

    public int compare(Libro libro1, Libro libro2)


    Quando poi ordinerai una lista es.:

    Collections.sort(listaLibri, new LibriPerDataPubblicazioneComparator());


    Tutto qui.
  • Re: Ordinare una lista di oggetti di tipo Libro

    andbin ha scritto:


    Dentro implementi il compare, che grazie all'uso della parametrizzazione <Libro> ha la forma:

    public int compare(Libro libro1, Libro libro2)
    Grazie ancora della risposta Ho pensato sia meglio usare un Comparator in quanto voglio eseguire diversi ordinamenti. Non capisco però bene come funziona, mi spiego meglio, nel metodo compare cosa devo scrivere al suo interno? Come faccio nel caso voglio ordinarli per nome (quindi titolo del libro) alfabeticamente?

    Grazie ancora
  • Re: Ordinare una lista di oggetti di tipo Libro

    IDanielZito ha scritto:


    Non capisco però bene come funziona, mi spiego meglio, nel metodo compare cosa devo scrivere al suo interno?
    Dato il: public int compare(Libro libro1, Libro libro2)

    Devi semplicemente restituire un valore <0, 0 o >0 per indicare, secondo il TUO criterio di ordinamento che hai scelto, rispettivamente se per te libro1 è minore, uguale o maggiore di libro2.

    IDanielZito ha scritto:


    Come faccio nel caso voglio ordinarli per nome (quindi titolo del libro) alfabeticamente?
    Immaginiamo che Libro abbia un getTitolo() (ritorna String):
    public int compare(Libro libro1, Libro libro2) {
        return libro1.getTitolo().compareTo(libro2.getTitolo());
    }
    In questo caso siccome il titolo è String, sfruttiamo il fatto che String è Comparable ed offre quindi il compareTo.
  • Re: Ordinare una lista di oggetti di tipo Libro

    IDanielZito ha scritto:


    Non capisco però bene come funziona, mi spiego meglio, nel metodo compare cosa devo scrivere al suo interno? Come faccio nel caso voglio ordinarli per nome (quindi titolo del libro) alfabeticamente?
    Il metodo compare restituisce un numero intero che indica se il primo oggetto (nel tuo caso un Libro) è minore, maggiore o uguale del secondo oggetto secondo il criterio di ordinamento considerato.

    Dovresti quindi resituire un numero negativo se il primo oggetto è "minore" del secondo oggetto, un numero positivo nel caso opposto e 0 se i due oggetti sono uguali.
    Questo in genere perché l'ordinamento viene effettuato in ordine crescente, se vuoi invertire l'ordine si può fare.

    Puoi scegliere tu il modo in cui fare il confronto ma, come dicevo in precedenza, visto che vuoi utilizzare l'ordinamento alfabetico in base al nome, puoi semplicemente sfruttare il compareTo della classe String.

    Trovi diversi esempi in rete comunque !
  • Re: Ordinare una lista di oggetti di tipo Libro

    Comincia ad essere più chiaro, ho ancora due quesiti pero

    1. posso utilizzare il compareTo anche nella classe Comparator che ho creato a parte?

    2. Non ho ben capito cosa succede nel seguente ritorno:
    return libro1.getNome().compareTo(libro2.getNome()
    il compareTo cosa dovrebbe fare?
  • Re: Ordinare una lista di oggetti di tipo Libro

    IDanielZito ha scritto:


    1. posso utilizzare il compareTo anche nella classe Comparator che ho creato a parte?
    Il compareTo di altri oggetti (le proprietà dell'oggetto che stai comparando) sì, certamente. Vedi esempio prima.

    IDanielZito ha scritto:


    2. Non ho ben capito cosa succede nel seguente ritorno:
    return libro1.getNome().compareTo(libro2.getNome()
    il compareTo cosa dovrebbe fare?
    Il compareTo di String confronta le stringhe lessicograficamente, ovvero "arancia" viene dopo di "albicocca".

    Quindi nel mio esempio

    libro1.getTitolo().compareTo(libro2.getTitolo())

    Il risultato è qualcosa (il valore non importa) minore di 0 se il titolo di libro1 è minore del titolo di libro2. E al contrario per > 0 oppure 0 se uguali.
  • Re: Ordinare una lista di oggetti di tipo Libro

    Ah finalmente capisco

    Aggiungendo poi il sort nel main l'ordinazione viene eseguita automaticamente?
  • Re: Ordinare una lista di oggetti di tipo Libro

    IDanielZito ha scritto:


    Ah finalmente capisco

    Aggiungendo poi il sort nel main l'ordinazione viene eseguita automaticamente?
    Esatto, metodi come sort () all'interno richiamano compare o compareTo tutte le volte necessarie tra le diverse coppie di elementi fino a completare l'ordinamento.
  • Re: Ordinare una lista di oggetti di tipo Libro

    Vi ringrazio
    Posso capire che molte cose dovrebbero essere scontate ma non lo sono
    Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
11 risposte