Ordinare una lista in Groovy è un'operazione piuttosto semplice, anche con liste di oggetti complessi. Infatti è sufficiente invocare il metodo sort() come negli esempi seguenti:
// ordinamento di un elenco di numeri
def numbers = [4,2,5,3,1]
assert [1,2,3,4,5] = numbers.sort()
// ordinamento di un elenco di stringhe
def letters = [c,d,a,b,e]
assert [a,b,c,d,e] = letters.sort()
// ordinamento di un elenco di oggetti in base ai campi
def people = [ new Person(id: 2, name: Marco),
new
Person
(id: 1, name: Jader),
new
Person
(id: 3, name: Andrea) ]
people
.sort{ it.id } // produce [Jader, Marco, Andrea]
people
.sort{ it.name }
// produce [Andrea, Jader, Marco]
Però, nel caso in cui ci si trovi a lavorare con un oggetto di tipo List<List<String>> le cose sono un pò più complesse (ma non poi troppo).
Supponiamo quindi di avere una lista di oggetti che, per qualche motivo applicativo, dobbiamo trasformare in una lista di liste.
Come prima cosa creiamo la nostra lista di liste:
def list = new ArrayList<List<String>>()
//
people
rappresenta una List<Person>
people.each { person->
def objCols = new ArrayList<String>()
objCols.add
person
.id // indice posizionale = 0
objCols.add
person
.name //
indice posizionale = 1
objCols.add
person
.surname //
indice posizionale = 2
//...e così via
list.add objCols
}
A questo punto è necessario definire un apposito comparatore che effettui il confronto posizionale tra gli elementi.
byName = [
compare:{ a,b-> a[1]<=>b[1] }
] as Comparator
Per capire lo snippet occorre ricordare che siamo in presenza di una List<List<String>> pertanto il singolo elemento della lista è una List<String>; di conseguenza è necessario specificare l'indice posizionale dell'elemento della lista interna che si vuole confrontare, nel nostro caso 1 ossia il nome.
A questo punto è possibile ordinare la lista:
list.sort(byName) // modalità ascendente
list.sort(byName).reverse() // modalità discendente
Enjoy!