Ordinare delle List in Java 0
L’ordinamento di una lista è una procedura che viene utilizzata in una marea di applicazioni. Se non volgliamo implementare direttamente un algoritmo di ordinamento (il buon vecchio bubble sort ad esempio), le API di Java ci metono a disposizione la classe di utilità Collections che contiene una serie di metodi statici che operano o ritornano delle Collection.
Il metodo che ci interessa prendere in esame per ordinare una List è il metodo sort che ha due differenti signature:
public static void sort(List list) che ordina una lista in ordine crescente
public static void sort(List list, Comparator c) che ordina la List con la logica specificata dal Comparator.
Comparator è un’interfaccia che presenta solo due metodi:
int compare(Object o1, Object o2) che compara i due oggetti per ordinarli
boolean equals(Object obj) che indica se l’oggetto specificato è uguale al Comparator stesso
Se vogliamo ordinare una lista contenente delle istanze di una nostra classe, sarà sufficiente creare una classe che implementi Comparator e ridefinisca il metodo compare (non ci interesa ridefinire il metodo equals perchè sfrutteremo l’implementazione che ha da Object).
Supponiamo di avere una classe come la segunte:
public class MyClass {
private int a = 0;
private int b = 0;
public MyClass(int a, int b) {
this.a = a;
this.b = b;
}
public int getA() {
return this.a;
}
public int getB() {
return this.b;
}
public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
}
Vogliamo ora implementare un comparator che ordini in base alla somma dei due campi a e b di MyClass:
public class MyComparator implements Comparator {
public int compare(Object obj1, Object obj2) {
MyClass c1 = (MyClass)obj1;
MyClass c2 = (MyClass)obj2;
int s1 = c1.getA() + c1.getB();
int s2 = c2.getA() + c2.getB();
return s1 - s2;
}
}
}
Per ordinare una List contenente tanti oggetti MyClass sarò sufficiente fare:
List myList = new ArrayList(); myList.put( new MyClass(5,7) ); myList.put( new MyClass(1,1) ); myList.put( new MyClass(2,0) ); myList.put( new MyClass(7,9) ); Collections.sort( myList, new MyComparator() );
Se si tenta di ordinare una List che contiene oggetti di tipo diverso da MyClass verrà generata una eccezione ClassCastException.






