bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Ordinare una lista di liste in Groovy

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!

Precedente
Commenti
Nessun commento. Vuoi essere il primo.