Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    che differenza c è nell usare l interfaccia Comparable e Comparator????

    so che entrambi sono usati per comparare elementi...ma che cambia tra l uno e l altro?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Comparable definisce quello che è il "natural order" (l'ordine naturale) tra gli elementi di una classe. Ciò significa che, se due o più elementi di una determinata classe devono essere comparati fra di loro per stabilire chi viene prima e chi dopo, è corretto far implementare Comparable a tale classe. In questo modo, la maggior parte delle funzioni di ordinamento "naturale" sapranno come ordinare gli elementi di quella classe.

    Comparator, invece, definisce una funzione di ordinamento che potenzialmente nulla ha a che vedere con l'ordinamento normale (naturale) degli oggetti.

    Facciamo un esempio. Supponiamo di avere una classe che contiene un campo String.
    Tale campo String rappresenta un "ID" ed è anche il campo di ordinamento degli oggetti.

    codice:
    public class MiaClasse implements Comparable<MiaClasse> {
       private String idClasse;
       ...
       public String getIdClasse() { return idClasse; }
    
       @Override
       public int compareTo(MiaClasse mc) {
          return this.idClasse.compareTo( mc.idClasse );
       }
    }
    Questo è l'ordinamento "naturale" degli oggetti MiaClasse: ovvero, ordinando lessicograficamente le stringhe "idClasse" ottengo l'ordinamento degli oggetti.

    Supponiamo, ora, che questo idClasse sia una stringa contenente un numero (il motivo di questa scelta implementativa non ci interessa). Un comparatore (Comparator) potrebbe voler mettere gli oggetti MiaClasse in ordine in base al valore numerico di questo ID (l'ordinamento lessicografico delle stringhe non tiene conto del valore numerico: "1000" verrà sempre prima di "2"). Ecco che posso costruire un Comparator che effettui questa cosa (posso implementare Comparator direttamente sulla classe o su un altro oggetto, quest'ultima è la scelta migliore) e dare in pasto un elenco di oggetti MiaClasse e il Comparator a Collections.sort() per ottenere l'ordinamento desiderato:

    codice:
    List<MiaClasse> lst = ...   // Una lista di oggetti MiaClasse
    Collections.sort(lst, new Comparator<MiaClasse>() {
       @Override
       public int compare(MiaClasse m1, MiaClasse m2) {
          int val1 = Integer.parseInt(m1.getIdClasse());
          int val2 = Integer.parseInt(m2.getIdClasse());
          return val1 - val2;
       }
    });
    In questo modo ordino i miei oggetti secondo il valore numerico del mio ID... ordinamento che esula completamente dall'ordinamento naturale degli elementi.

    E posso costruire tanti comparatori quanti sono i tipi di ordinamento che mi interessano, anche più complessi di quello.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.