2012-06-08 11 views
8

Vorrei utilizzare un tipo che si comporta come un semplice elenco di coppie [(a,b)] che funge da dizionario, associando chiavi di tipo a a valori di tipo b, mantenendo un "utente" -specificato ", definito l'ordine delle chiavi. (vale a dire, proprio come con le liste ordinarie, mi piacerebbe poter "aggiungere" un elemento che viene riconosciuto come "ultimo elemento"). Tuttavia, mi piacerebbe che la ricerca di accesso casuale sui tasti fosse migliore delle prestazioni lineari, ovvero cosa,fornisce. Una possibilità sarebbe quella di mantenere solo una carta ordinaria, oltre a un elenco di chiavi che definisce il loro ordine:Un tipo di dizionario con un ordine definito di chiavi

data OrderedDict a b = OrderedDict (Map a b) [a] 

e quindi definire append operazioni, ecc che mantengono le due collezioni principali in sincronia. Sembra brutto però mantenere due raccolte separate delle stesse chiavi. Esiste un tipo di dati già pronto che combina già le chiavi ordinate con una ricerca di accesso casuale efficiente per chiave?

+0

Java [LinkedHashMap] (http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html) sembra fare qualcosa di simile : crea una lista di chiavi attraverso la mappa. OrderedDict di Python è semplicemente un elenco di coppie, quindi non sono di aiuto qui. –

+1

Cosa intendi con "ordine definito"? Dato due chiavi 'a1' e' a2', è a priori corretto se 'a1' precede' a2' o è la precedenza determinata in fase di esecuzione? – Peter

+1

@peter Voglio dire 'ordine definito' nello stesso senso come con le liste ordinarie - se aggiungo 'a2' dopo aver aggiunto' a1', quindi 'a1' precede' a2' – gcbenison

risposta

3

A meno che non abbia completamente frainteso la tua domanda, Data.Map fa esattamente questo, usando l'istanza Ord del tipo di chiave per l'ordine. Essendo un albero binario, l'implementazione mantiene anche le chiavi ordinate.

Data.Map.keys fornisce le chiavi di una mappa in ordine crescente; Poiché le trasformazioni, come ad esempio map, di una Carta sono puramente funzionali, l'ordine di attraversamento è irrilevante e tutti i modi per ottenere una sequenza di chiavi o coppie chiave/valore da una Mappa forniscono una lista ordinata.

+9

Credo che gcbenison richieda qualcosa come 'Data .Map' ma con la proprietà aggiuntiva di preservare l'ordine in cui sono inserite le chiavi. – huon

+0

Se si dispone di un tipo di chiave personalizzato, è possibile farlo definire il proprio ordine. Anche se funziona ancora solo se l'ordine può essere generato proceduralmente. – Evi1M4chine

3

Se si desidera solo per preservare alcuni fisso ordine (ad esempio, il tempo di inserimento) oltre ad avere O (log n) di ricerca/inserzioni, si può semplicemente utilizzare più mappe e aggiornarli contemporaneamente:

  1. Map a b per la memorizzazione dei dati effettivi e
  2. Map Int a che fornisce la chiave i-es nell'ordine. (Se hai bisogno anche di interrogare l'indice di una data chiave si potrebbe aggiungere un Map a Int)
4

Date un'occhiata a ixset biblioteca - permette di mantenere set indicizzate da più colonne (da a e Int nella vostra Astuccio). Questo è molto più gestibile che mantenere le mappe coerenti a mano

+0

Grazie - 'ixset' è bello. In questo caso non penso che corrisponda abbastanza al conto perché può consentire uno stato incoerente (più voci con lo stesso campo 'Int') e richiederebbe a un chiamante di eseguire un'operazione' append' per specificare esplicitamente l'indice - qualcosa non richiesto dalle liste ordinarie. – gcbenison

Problemi correlati