sort property empty collection array sorting groovy

sorting - property - Groovy list.sort por primero, segundo y tercer elementos



groovy sort array (7)

Tengo una lista groovy de listas, es decir,

list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]]

Me gustaría ordenarlo por orden del primer elemento, luego segundo, luego tercero.

Esperado

assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]

Empecé con list = list.sort{ a,b -> a[0] <=> b[0] } pero eso solo ordena el primer elemento. ¿Cómo terminas?

Gracias



Debería poder iterar a través de la ordenación deseada en orden inverso:

list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]] list = list.sort{ a,b -> a[2] <=> b[2] } list = list.sort{ a,b -> a[1] <=> b[1] } list = list.sort{ a,b -> a[0] <=> b[0] } assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]

Cada uno debe anular lo anterior solo lo suficiente para mantener la ordenación combinada intacta.

También puede encadenarlos en orden con el operador de Elvis, ?: , Que diferirá a la siguiente comparación cuando los anteriores son iguales (y <=> devuelve 0 ):

list.sort { a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] }


Esto es lo que se me ocurrió, no de la manera más maravillosa, supongo.

list = list.sort{ a,b -> if(a[0].compareTo(b[0]) == 0) { if(a[1].compareTo(b[1]) == 0) { return a[2].compareTo(b[2]); } else { return a[1].compareTo(b[1]); } } else { return a[0].compareTo(b[0]); } }


Hecho de la manera Groovy, independientemente del tamaño de las listas secundarias:

ll.sort { l1, l2 -> (e1, e2) = [l1, l2].transpose().find { e1, e2 -> e1 != e2 } e1 <=> e2 }


Puedes hacerlo en una línea:

list.sort { String.format(''%010d%010d%010d'', it[0], it[1], it[2]) }


Si desea ordenar matrices de longitud arbitraria (aunque homogénea), puede usar esto y lo hará en una sola pasada:

def list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]] list.sort { a, b -> for (int i : (0..<a.size())) { def comparison = (a[i] <=> b[i]) if (comparison) return comparison } return 0 } assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]]


puede usar la biblioteca CollectionUtils de kobo-commons.

http://wiki.github.com/kobo/kobo-commons/sort-by-multiple-keys

import org.jggug.kobo.commons.lang.CollectionUtils CollectionUtils.extendMetaClass() list = [[2, 0, 1], [1, 5, 2], [1, 0, 3]] list = list.sort{ [ it[0], it[1], it[2] ]} // sort by multiple keys assert list == [[1, 0, 3], [1, 5, 2], [2, 0, 1]] list2 = [ [name:"a", age:13], [name:"a",age:15], [name:"b", age:13] ] list2 = list2.sort{[it.name, it.age] } // sort by name and age assert list2 == [[name:"a", age:13], [name:"a", age:15], [name:"b", age:13]]