une table de tri par association en valeur, Lua
Question
Je possède une clé => table de valeur que je voudrais trier dans Lua. Les touches sont tous les entiers, mais ne sont pas consécutifs (et ont un sens). seule fonction de tri de Lua semble être table.sort
, qui traite tables sous forme de tableaux simples, en éliminant les clés d'origine et leur association avec des éléments particuliers. Au lieu de cela, je voudrais essentiellement pouvoir utiliser la fonction asort()
PHP.
Ce que j'ai:
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
Ce que je veux après l'opération de tri:
items = {
[1234] = "bar",
[3188] = "baz",
[1004] = "foo",
[7007] = "quux",
}
Toutes les idées?
Modifier Sur la base des réponses, je vais supposer que c'est tout simplement une bizarrerie étrange de l'interprète Lua intégré particulier, je travaille avec, mais dans tous mes tests, pairs()
revient toujours articles de table dans l'ordre dans lequel ils ont été ajoutés à la table. (À savoir les deux déclarations ci-dessus seraient itérer différemment).
Malheureusement, parce que ce n'est pas un comportement normal, il semble que je ne peux pas obtenir ce que je veux; Lua n'a pas les outils nécessaires intégré (bien sûr) et l'environnement embarqué moi est trop limité pour le contourner.
Encore, merci pour votre aide, tout!
La solution
Vous semblez mal comprendre quelque chose. Ce que vous avez ici est un . Les tableaux associatifs ont pas d'ordre explicite sur eux, par exemple il est seulement la représentation interne (généralement triée) qui les commande.
En bref -. Lua, les deux tableaux sont vous avez publié même
Qu'est-ce que vous voulez au contraire, est une telle représentation:
items = {
{1004, "foo"},
{1234, "bar"},
{3188, "baz"},
{7007, "quux"},
}
Alors que vous ne pouvez pas les obtenir par index maintenant (ils sont indexés 1, 2, 3, 4, mais vous peut créer un autre tableau d'index), vous pouvez les trier en utilisant table.sort
.
Une fonction de tri serait alors:
function compare(a,b)
return a[1] < b[1]
end
table.sort(items, compare)
Autres conseils
Comme dit Komel, vous avez affaire à des réseaux associatifs, qui ne sont pas ordonnés garantie.
Si vous voulez commander la clé en fonction de sa valeur associée tout en préservant la fonctionnalité de tableau associatif, vous pouvez faire quelque chose comme ceci:
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 est {} 1234,3188,1004,7007, et vous pouvez accéder à vos données comme ceci:
for _, key in ipairs(sortedKeys) do
print(key, items[key])
end
résultat:
1234 bar
3188 baz
1004 foo
7007 quux
hmm, a raté la partie de ne pas être en mesure de contrôler l'itération. il
Mais en lua il y a généralement toujours un moyen.
http://lua-users.org/wiki/OrderedAssociativeTable
Thats début. Maintenant, vous devrez remplacer les paires () que la bibliothèque utilise. Cela pourrait être une sous forme de paires = simples my_pairs. Vous pouvez ensuite utiliser la solution dans le lien ci-dessus
tableaux PHP sont différents des tables Lua.
-
Un tableau PHP peut avoir un liste ordonnée de paires de valeurs clés.
-
Une table Lua contient toujours un ensemble non ordonné de paires de valeurs clés.
Une table Lua agit comme un tableau quand un programmeur choisit d'utiliser des nombres entiers 1, 2, 3, ... en tant que touches. Les fonctions de syntaxe de la langue et de la bibliothèque standard, comme table.sort
offrent un soutien spécial pour les tables avec les touches consécutives entières.
Donc, si vous souhaitez émuler un tableau PHP, vous devrez le représenter en utilisant la liste des paires clé-valeur, ce qui est vraiment une table des tables, mais il est plus utile de penser comme une liste de clés -value paires. Passer une commande « moins que » fonction table.sort
et vous serez tous ensemble.
N.B.. Lua vous permet de mix touches consécutives entières avec d'autres types de clés dans la même table et la représentation est efficace. J'utilise cette fonction parfois, le plus souvent de marquer un tableau avec quelques morceaux de métadonnées.
Venir à ce quelques mois plus tard, avec la même requête. La réponse recommandée semblait indiquer exactement l'écart entre ce qui était nécessaire et comment cela ressemble en LUA, mais il ne m'a pas obtenir ce que je cherchais exactement: -. Qui était Hash trié par clé
Les trois premières fonctions de cette page a cependant: http://lua-users.org/wiki/ SortedIteration
Je l'ai fait un bref peu de Lua codage, il y a quelques années, mais je ne suis plus couramment il.
Face à un problème similaire, je copiais mon tableau à un autre tableau avec les touches et les valeurs inversées, puis utilisé sort
sur le nouveau tableau.
Je ne savais pas d'une possibilité de trier le tableau selon la méthode Kornel Kisielewicz recommande.