12 dicembre 2008

Ordinare ArrayList in Java

In Java è indispensabile a volte dover ordinare collezioni di oggetti in maniera "custom". Se ad esempio avessimo un ArrayList di stringhe e volessimo ordinare tale collezione in ordine lessicologico, basterebbe richiamare il metodo : Collections.sort(arrayList);.
Tale operazione però su altri tipi di oggetti non funziona, poichè bisogna definire i criteri in base ai quali tale collezione andrebbe ordinata.

Ci sono 2 possibili approcci per la risoluzione di questo genere di problematiche.

Modificare la classe facendole implementare l'interfaccia Comparable
E' necessario che l'oggetto che inseriamo all'interno della collection implementi l'interfaccia Comparable e quindi bisogna definire il metodo compareTo che rappresenta il metodo richiamato dal Collections.sort per poter stabilire con quale criterio ordinare.
Vediamo un esempio :
public class MyClass implements Comparable {
public int ordine;
....
public int compareTo(Object o) {
if (o!=null){
MyClass objOfMyClass = (MyClass)o;
// qui ci arriva solo se i titoli sono uguali o un titolo è nullo quindi confronto i codici edizione
if (ordine>objOfMyClass.ordine){
return 1;
}else{
if (ordine==objOfMyClass.ordine){
return 0;
}
}
}
return -1;
}
}

Per poter ordinare L'ArrayList quindi basta richiamare il metodo:
List arrayList = new ArrayList ();
arrayList.add(myObj1);
arrayList.add(myObj2);
.....
Collections.sort(arrayList);


Creare una classe che implementa Comparator
Questo metodo necessita la creazione di una classe che funge da "Comparator" tra 2 oggetti. E' necessario quindi che tale classe implementi il metodo compare mediante cui il metodo Collection.sort riesce a stabilire l'ordine richiamandolo con i 2 oggetti che intende confrontare.
Vediamo un esempio :
public class OrderComparator implements Comparator {
public int compare(Object obj1, Object obj2) {
if (obj1!=null && obj1!=null){
MyClass objOfMyClass1 = (MyClass)obj1;
MyClass objOfMyClass2 = (MyClass)obj2;
if (objOfMyClass1.ordine>objOfMyClass2.ordine){
return 1;
}else{
if (objOfMyClass1.ordine==objOfMyClass2.ordine){
return 0;
}
}
}
return -1;
}
}

Per poter ordinare L'ArrayList quindi basta richiamare il metodo:
List arrayList = new ArrayList ();
arrayList.add(myObj1);
arrayList.add(myObj2);
.....
Collections.sort(arrayList,new OrderComparator () );

Naturalmente è possibile definire una serie di comparator da utilizzare quando e come si vuole, in maniera tale da poter avere a disposizione diversi criteri di ordinamento per uno stesso tipo di Classe.

2 commenti:

SAL ha detto...

Bel blog. Ti Interessa uno scambio di link? In caso il mio è http://programmazioneit.blogspot.com (ti ho già linkato, i contenuti sono analoghi ai tuoi)

Grazie, Salvatore

Anonimo ha detto...

Grazie mille!
giuseppe