2012-11-16 16 views
16

Sono interessato ad usare una mappa ordinata in groovy (con gremlin che è un DSL per database di grafici).Mappe ordinate in groove

Ho visto questo blog post su mappe ordinate qui, ma sono ancora un po 'confuso.

  • Come vengono dichiarate le mappe ordinate? È diverso dal modo standard per le mappe y = [:]?

  • Quando si utilizza una mappa ordinata, gli elementi inseriti nell'elenco si troveranno nell'ordine in cui sono inseriti? O dovrò eseguire sort{} prima che gli elementi nella mappa ordinata siano ordinati?

risposta

37

Se basta dichiarare una mappa in questo modo:

def m = [:] 

Quindi, si può vedere Groovy di default fa una LinkedHashMap

assert m.getClass().name == 'java.util.LinkedHashMap' 

Se si guarda al documentation for LinkedHashMap si dice:

tabella hash e collegato elenca l'implementazione dell'interfaccia Map, con un ordine di iterazione prevedibile. Questa implementazione differisce da HashMap in quanto mantiene una lista doppiamente collegata che attraversa tutte le sue voci. Questo elenco collegato definisce l'ordine di iterazione, che è normalmente l'ordine in cui le chiavi sono state inserite nella mappa (ordine di inserimento).

Così LinkedHashMap ha un ordine, e si può influire su tale ordine in Groovy chiamando sort

def m = [ b:1, a:2 ] 

// Sort by descending value 
m = m.sort { -it.value } 

println m // prints [a:2, b:1] 

Se volete ordinamento naturale delle chiavi, quindi è possibile utilizzare una delle mappe ordinate di Java, come ad come TreeMap

dire che si desidera utilizzare questo in Groovy, si può fare:

// def tm = [ tim_yates:1, F21:2 ] as TreeMap // works as well 
TreeMap tm = [ tim_yates:1, F21:2 ] 

Poi la stampa di questo, si può vedere che è ordinato dai tasti:

println map // prints [F21:b, tim_yates:a] 

Un TreeMap sarà mantenere l'ordine quando si aggiungono le chiavi. A LinkedHashMap non rimarrà automaticamente ordinato quando si aggiungono nuovi valori.