Esto debe hacerlo:
// Define our input list
def list = [ 'Armadillo', 'Cat', 'Dog', 'Cow', 'Zebra', 'Horse', 'Cow' ]
// Define a closure that will do the sorting
def sorter = { String a, String b, List prefixes=[ 'Cat', 'Cow' ] ->
// Get the index into order for a and b
// if not found, set to being Integer.MAX_VALUE
def (aidx,bidx) = [a,b].collect { prefixes.indexOf it }.collect {
it == -1 ? Integer.MAX_VALUE : it
}
// Compare the two indexes.
// If they are the same, compare alphabetically
aidx <=> bidx ?: a <=> b
}
// Create a new list by sorting using our closure
def sorted = list.sort false, sorter
// Print it out
println sorted
que imprime:
[Cat, Cow, Cow, Armadillo, Dog, Horse, Zebra]
he comentado al tratar de explicar cada paso que se necesita. Mediante la adición de los elementos de prefijo por defecto como un parámetro opcional sobre el cierre sorter
, significa que podemos hacer cosas como esta para cambiar el valor por defecto:
// Use Dog, Zebra, Cow as our prefix items
def dzc = list.sort false, sorter.rcurry([ 'Dog', 'Zebra', 'Cow' ])
println dzc
Que luego imprime la lista clasificada como:
[Dog, Zebra, Cow, Cow, Armadillo, Cat, Horse]
Si Cow está en la lista y Cat no lo está, ¿la vaca todavía necesita estar en el segundo lugar? ¿Qué pasa si la lista es simplemente '['Cow']'? – ataylor
No. Entonces la vaca debería ser la primera. – bladet