Associativo classificare una tabella in valore Lua
Domanda
Ho una tabella valore chiave => Mi piacerebbe ordinare in Lua. I tasti sono tutti gli interi, ma non sono consecutivi (e hanno significato). funzione di ordinamento solo di Lua sembra essere table.sort
, che tratta tabelle come matrici semplici, scartando le chiavi originali e la loro associazione con gli oggetti particolari. Invece, mi piacerebbe essenzialmente essere in grado di utilizzare la funzione asort()
di PHP.
Quello che ho:
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
Quello che voglio dopo l'operazione di ordinamento:
items = {
[1234] = "bar",
[3188] = "baz",
[1004] = "foo",
[7007] = "quux",
}
Tutte le idee?
Modifica Sulla base delle risposte, ho intenzione di pensare che è semplicemente un capriccio dispari di particolare interprete Lua incorporato con cui sto lavorando, ma in tutti i miei test, pairs()
sempre rendimenti elementi della tabella nell'ordine in cui sono stati aggiunti alla tabella. (Cioè i due dichiarazioni sopra dovessero scorrere diversamente).
Purtroppo, perché non è un comportamento normale, sembra che non riesco a ottenere quello che mi serve; Lua non ha gli strumenti necessari built-in (ovviamente) e l'ambiente integrato è troppo limitata per me lavorare intorno ad esso.
Ancora, grazie per il vostro aiuto, tutti!
Soluzione
Ti sembra di fraintendere qualcosa. Quello che abbiamo qui è un array associativo . array associativi non hanno alcun ordine esplicito su di loro, per esempio è solo la rappresentazione interna (di solito allineati) che li ordina.
In breve -. In Lua, entrambe le matrici hai postato sono stesso
Che cosa si vorrebbe, invece, è una tale rappresentazione:
items = {
{1004, "foo"},
{1234, "bar"},
{3188, "baz"},
{7007, "quux"},
}
Anche se non è possibile ottenere in base all'indice di ora (sono indicizzati 1, 2, 3, 4, ma possono creare un altro array indice), è possibile ordinare utilizzando table.sort
.
Una funzione di ordinamento sarebbe allora:
function compare(a,b)
return a[1] < b[1]
end
table.sort(items, compare)
Altri suggerimenti
Come ha detto Komel, hai a che fare con gli array associativi, che non hanno ordinamento garantito.
Se si desidera ordinamento chiave in base al suo valore associato allo stesso tempo preservando la funzionalità array associativo, si può fare qualcosa di simile:
function getKeysSortedByValue(tbl, sortFunction)
local keys = {}
for key in pairs(tbl) do
table.insert(keys, key)
end
table.sort(keys, function(a, b)
return sortFunction(tbl[a], tbl[b])
end)
return keys
end
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
local sortedKeys = getKeysSortedByValue(items, function(a, b) return a < b end)
sortedKeys è {} 1234,3188,1004,7007, ed è possibile accedere ai dati in questo modo:
for _, key in ipairs(sortedKeys) do
print(key, items[key])
end
Risultati:
1234 bar
3188 baz
1004 foo
7007 quux
hmm, perse la parte di non essere in grado di controllare l'iterazione. ci
Ma in lua di solito c'è sempre un modo.
http://lua-users.org/wiki/OrderedAssociativeTable
Quello è un inizio. Ora si avrebbe bisogno per sostituire le coppie () che la biblioteca utilizza. Questo potrebbe essere un semplici come coppie = my_pairs. È quindi possibile utilizzare la soluzione nel link qui sopra
array PHP sono diverse dalle tabelle Lua.
-
Un array PHP può avere un ordinato elenco di coppie di valori-chiave.
-
tabella A Lua contiene sempre un insieme non ordinato di coppie di valori-chiave.
tabella A Lua funge da matrice quando un programmatore sceglie di utilizzare interi 1, 2, 3, ... come tasti. Le funzioni di sintassi e linguaggio libreria standard, come table.sort
offrono un supporto speciale per le tabelle con i tasti consecutivi interi.
Quindi, se si desidera emulare un array PHP, dovrete rappresentarlo mediante lista di coppie chiave-valore, che è davvero una tabella di tavoli, ma è più utile pensare ad esso come una lista di chiave coppie -value. Passare un personalizzato "meno-che" la funzione di table.sort
e sarete tutti insieme.
NB. Lua consente di Mix chiavi consecutivi interi con qualsiasi altro tipo di chiavi nel stesso tavolo e la rappresentazione è efficiente. Io uso questa caratteristica a volte, di solito per etichettare un array con alcuni pezzi di metadati.
Venendo a questo un paio di mesi più tardi, con la stessa query. La risposta consigliata sembrava di individuare il divario tra ciò che è stato richiesto e come questo aspetto in LUA, ma non mi ha ottenuto ciò che cercavo esattamente: -. Che era un Hash ordinati per chiave
I primi tre funzioni in questa pagina ha tuttavia: http://lua-users.org/wiki/ SortedIteration
Ho fatto una breve po 'di Lua codifica di un paio di anni fa, ma io non sono più fluente in esso.
Di fronte a un problema simile, ho copiato il mio allineamento ad un altro array con chiavi e valori invertiti, quindi usato sort
sul nuovo array.
Non ero a conoscenza di una possibilità di ordinare la matrice utilizzando il metodo Kornel Kisielewicz consiglia.