Asociativamente una tabla de clasificación por valor en Lua
Pregunta
Tengo una tabla de valores de clave => Me gustaría ordenar en Lua. Las claves son todos los números enteros, pero no son consecutivos (y tienen un significado). Sólo función de clasificación de Lua parece ser table.sort
, que trata tablas como matrices simples, descartando las llaves originales y su asociación con los objetos particulares. En su lugar, me gustaría esencialmente gustaría ser capaz de utilizar la función asort()
de PHP.
Lo que tengo:
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
Lo que quiero después de la operación de ordenación:
items = {
[1234] = "bar",
[3188] = "baz",
[1004] = "foo",
[7007] = "quux",
}
¿Alguna idea?
Editar Sobre la base de las respuestas, voy a asumir que es simplemente un capricho impar de la intérprete de Lua incrustado particular, estoy trabajando con, pero en todas mis pruebas, siempre devuelve pairs()
elementos de la tabla en el orden en que se añadieron a la mesa. (Es decir, las dos declaraciones anteriores serían iterar diferente).
Por desgracia, debido a que no es un comportamiento normal, parece que no puedo conseguir lo que necesito; Lua no tiene las herramientas necesarias incorporado (por supuesto) y el entorno incorporado es demasiado limitado para mí trabajar alrededor de ella.
Sin embargo, gracias por su ayuda, todos!
Solución
Parece no entender algo. Lo que tenemos aquí es un matriz asociativa . Las matrices asociativas no tienen un orden explícita en ellos, por ejemplo, es sólo la representación interna (normalmente ordenadas) que les ordena.
En pocas palabras -. En Lua, tanto de las matrices se publican son mismo
¿Qué le gustaría que en cambio, es una representación como:
items = {
{1004, "foo"},
{1234, "bar"},
{3188, "baz"},
{7007, "quux"},
}
Si bien no se puede conseguir mediante el índice de ahora (que se indexan 1, 2, 3, 4, pero puede crear otra matriz de índice), puede ordenar usando table.sort
.
A función de clasificación sería entonces:
function compare(a,b)
return a[1] < b[1]
end
table.sort(items, compare)
Otros consejos
Como dijo Komel, que está tratando con matrices asociativas, que no tienen garantiza el orden.
Si desea ordenar clave basada en su valor asociado al mismo tiempo preservar la funcionalidad de matriz asociativa, se puede hacer algo como esto:
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 es {} 1234,3188,1004,7007, y se puede acceder a sus datos de esta manera:
for _, key in ipairs(sortedKeys) do
print(key, items[key])
end
resultado:
1234 bar
3188 baz
1004 foo
7007 quux
hmm, se perdió la parte acerca de no ser capaz de controlar la iteración. hay
Pero en lua por lo general hay siempre una manera.
http://lua-users.org/wiki/OrderedAssociativeTable
Eso es un comienzo. Ahora lo que se necesita para reemplazar los pares () que utiliza la biblioteca. Eso podría ser una simples como pares = my_pairs. A continuación, puede utilizar la solución en el foro
matrices de PHP son diferentes de tablas Lua.
-
Una matriz de PHP puede tener un lista ordenada de pares de clave y valor.
-
tabla A Lua siempre contiene un conjunto desordenado de pares de clave y valor.
Una tabla Lua actúa como una matriz cuando un programador elige utilizar números enteros 1, 2, 3, ... como claves. Las funciones de la sintaxis del lenguaje y de la biblioteca estándar, como table.sort
ofrecen un apoyo especial para las tablas con claves enteros consecutivos.
Así que, si quieres emular una matriz PHP, usted tiene que representarlo utilizando lista de pares clave-valor, que es realmente una mesa de tablas, pero es más útil pensar en ella como una lista de claves pares-valor. Pasar una costumbre "menos que" la función de table.sort
y usted estará listo.
N.B. Lua le permite mezclar llaves consecutiva enteros con cualquier otro tipo de llaves en el mismo mesa y la representación es eficiente. I utilizar esta función a veces, por lo general para etiquetar una matriz con unas pocas piezas de metadatos.
Al venir a este unos meses más tarde, con la misma consulta. La respuesta recomendada parecía identificar la brecha entre lo que se requiere y cómo se ve en LUA, pero no me consiguió lo que buscaba exactamente: -. Que fue un hash ordenados por clave
Las tres primeras funciones de esta página DID sin embargo: http://lua-users.org/wiki/ SortedIteration
lo hice hace una breve poco de Lua codificación de un par de años, pero ya no soy fluido en ella.
Cuando se enfrenta a un problema similar, he copiado mi matriz a otra matriz con claves y valores invertidos, entonces se utiliza sort
en la nueva matriz.
I no era consciente de la posibilidad de ordenar la matriz utilizando el método Kornel Kisielewicz recomienda.