2017-09-08 6 views
2

Je la table Lua suivante stockée dans la variable T:Comment trier les tables internes dans Lua par leur "score", puis "index"?

{ 
    ["mn"] = { ["index"] = 7, ["key"] = "mn", ["score"] = 0 }, 
    ["kl"] = { ["index"] = 6, ["key"] = "kl", ["score"] = .4 }, 
    ["ef"] = { ["index"] = 3, ["key"] = "ef", ["score"] = .3 }, 
    ["ab"] = { ["index"] = 1, ["key"] = "ab", ["score"] = 0 }, 
    ["cd"] = { ["index"] = 2, ["key"] = "cd", ["score"] = .1 }, 
    ["gh"] = { ["index"] = 4, ["key"] = "gh", ["score"] = 0 }, 
    ["ij"] = { ["index"] = 5, ["key"] = "ij", ["score"] = .2 } 
} 

Je veux trier toutes les tables internes de la table T de la façon suivante:
1. Les tableaux avec plus score sont mis sur haut.
2. Les tables avec score sont triées par leur index.

Ainsi, après le tri, la table séquentielle suivante doit être produit sur la sortie:

{ 
    [1] = { ["index"] = 6, ["key"] = "kl", ["score"] = .4 }, -- highest "score" 
    [2] = { ["index"] = 3, ["key"] = "ef", ["score"] = .3 }, 
    [3] = { ["index"] = 5, ["key"] = "ij", ["score"] = .2 }, 
    [4] = { ["index"] = 2, ["key"] = "cd", ["score"] = .1 }, 
    [5] = { ["index"] = 1, ["key"] = "ab", ["score"] = 0 }, -- lowest "score", lowest "index" 
    [6] = { ["index"] = 4, ["key"] = "gh", ["score"] = 0 }, -- when scores are the same, sort by their "index" instead 
    [7] = { ["index"] = 7, ["key"] = "mn", ["score"] = 0 } -- lowest "score", highest "index" 
} 

Comment accomplir ce genre de table Lua?

+0

https://devdocs.io/lua~5.3/index#pdf-table.sort – hjpotter92

+0

Je comprends que je dois utiliser fonction 'table.sort' Lua .Mais, je ne sais pas comment l'utiliser pour ce cas. – Pojat

Répondre

1

Vous devez d'abord convertir le hachage que vous avez dans une table, puis trier les éléments de cette table en utilisant une fonction de tri personnalisée qui trie par score (décroissant), puis par index (ascendant) pour les éléments qui ont le même score.

Quelque chose comme cela devrait fonctionner:

local hash = { 
    ["mn"] = { ["index"] = 7, ["key"] = "mn", ["score"] = 0 }, 
    ["kl"] = { ["index"] = 6, ["key"] = "kl", ["score"] = .4 }, 
    ["ef"] = { ["index"] = 3, ["key"] = "ef", ["score"] = .3 }, 
    ["ab"] = { ["index"] = 1, ["key"] = "ab", ["score"] = 0 }, 
    ["cd"] = { ["index"] = 2, ["key"] = "cd", ["score"] = .1 }, 
    ["gh"] = { ["index"] = 4, ["key"] = "gh", ["score"] = 0 }, 
    ["ij"] = { ["index"] = 5, ["key"] = "ij", ["score"] = .2 } 
} 
local tbl = {} 
for _,v in pairs(hash) do 
    table.insert(tbl, v) 
end 
table.sort(tbl, function(a,b) 
    return a.score > b.score or a.score == b.score and a.index < b.index 
    end) 
+0

Merci pour votre aide! :RÉ – Pojat

1

En lua, la table englobe deux structures de données: le tableau et le dictionnaire.

des moyens de tri tri tableau, où chaque élément est associé à un index numérique et les indices sont consécutifs à savoir: 1,2,3 ...

Vous tableau initial est en fait un dictionnaire - chaque entrée a un arbitraire clé associée à elle (dans votre cas, ce sont des chaînes). Par conséquent, ce que vous décrivez n'est pas réellement une tâche de tri, vous voulez un type de table différent à la fin.

table.sort fonctionne sur la partie tableau de la table lua, c'est-à-dire sur les éléments dont les indices commencent à 1 et se terminent à la première entrée nulle.

a={s=3,['r']=3, 5,3,2, nil,21} 
       |these| 
       |ones | 

Donc, vous devez d'abord créer un tableau et trier qu'un:

local sorted={} 
for k,v in pairs(T) do 
    table.insert(sorted,v) 
end 
table.sort(sorted,function(a,b) 
    --your code here 
    --function should return true if element `a` from the array `sorted` 
    --must be higher (to the left of) `b` 
end) 

Sinon, vous pouvez stocker les entrées de la même table à la fois dans le cadre du dictionnaire et tableau, la fonction table.sort ignorerait la dictionnaire. Mais il ne serait pas judicieux de faire une boucle sur la table en utilisant pairs et d'ajouter de nouveaux éléments en même temps. Ainsi, la manière idiomatique impliquerait toujours une copie intermédiaire.

+0

Merci pour votre explication. – Pojat