2013-10-08 16 views
9

Ecco un esempioCome mantenere l'ordine di una tabella Lua con chiavi stringa?

local query = {} 
query['count'] = 1 
query['query'] = 2 
for k,v in pairs(query) do 
    print(k) 
end 

Quanto sopra stampare prima query poi count.

Come posso assicurarmi senza aggiungere una chiave di indice int che le stringhe di chiavi mantengano il loro ordine quando faccio il giro del tavolo?

+0

Con le tabelle del dizionario, non credo che manterrà lo stesso ordine. Se desideri mantenere un certo ordine, ti suggerisco di creare una seconda tabella indicizzata con i campi nell'ordine desiderato. Quindi passa attraverso quella tabella e chiama la query [v]. – Josh

risposta

9

Ho risposto in commento, ma lo sto spostando qui per dare un'idea migliore di ciò di cui sto parlando.

local queryindex = {"count", "query"} 
local query = {} 
query['count'] = 1 
query['query'] = 2 

for _,v in ipairs(queryindex) do 
    print(query[v]) 
end 
+0

Il corpo del ciclo 'for' stamperà solo i numeri, intendi' print (v) '? –

+0

No, intendo precisamente quello che ho risposto. Suppongo che la query ['count'] e la query ['query'] non siano realmente numeri, ma stringhe, e stava solo usando i numeri per dimostrare il posizionamento. 'print (v)' stampa solo 'count' o 'query', e non i loro valori all'interno della tabella 'query'. – Josh

+0

Questo non è corretto. ipairs() ordina gli elementi in una tabella con * chiavi integer * e ignorerà quegli elementi con le chiavi non in numeri interi. – Jinfeng

2
coppia

Finché il valore è garantito per essere da 1, 2, 3, in una certa N senza fori e senza duplicati, come nel tuo esempio, è possibile costruire una sequenza usando invertita chiave-valore come questo :

local seq = {} 
for k,v in pairs(query) do 
    seq[v] = k 
end 

for _,v in ipairs(seq) do 
    print(v) 
end 
1

in Lua, solo le tabelle con 1-basati tasti interi consecutivi (alias tabelle array) possono essere analizzati in ordine.

Quindi, se si vuole analizzare un tavolo t al fine, ciò che si fa è:

  • raccogliendo le sue chiavi in ​​una tabella matrice simile
  • ordinamento che keys tavolo
  • utilizzando il keys tabella per iterare su t.

Esempio:

function sortedKeys(query, sortFunction) 
    local keys, len = {}, 0 
    for k,_ in pairs(query) do 
    len = len + 1 
    keys[len] = k 
    end 
    table.sort(keys, sortFunction) 
    return keys 
end 

... 

local query = {} 
query['count'] = 1 
query['query'] = 2 
for _,k in pairs(sortedKeys(query)) do 
    print(k, query[k]) 
end 

E 'anche possibile creare an iterator per farlo un po' più idiomatico, ma non ho mai avuto la necessità.

Problemi correlati