Jump to content

ATME (1.46) : indexlist


CougarFFW04
 Share

Recommended Posts

Bon ben j'ai quand même une question...

La fonction sortnested suivant permet d'ordonner une table par ordre croissant (ou décroissant) sur un l'index choisi.

 

function sortnested(tabtab, order, indtosort)
   table.sort(tabtab, function (left, right)
       if order == "incr" then
           return left[indtosort] < right[indtosort]
       else
           return left[indtosort] > right[indtosort]
       end
   end)
end

Testé sur une table a la con et ca marche nickel.

 

Par contre si je test sur une liste ATME, sauf erreur de ma part, ca n'a pas l'air de fonctionner...

 

Sur ma table je fais un sort sur index 3 et ensuite j'affiche le premier de la liste mais apparement ca reste dans le même ordre...

 

    sortnested(blueTargetsListe, "incr", 3)
   ATME.displayForAll("SORTED "..blueTargetsListe:get(1)[3],3)

Il y a une raison particulière ou simplement il est beaucoup trop tard pour que je puisse encore refléchir corrctement pour aujourd'hui :joystick:


Edited by CougarFFW04
Link to comment
Share on other sites

bonsoir.

 

si ta liste est une liste classique lua, ton script fonctionnera.

 

si ta table est une liste indexée définie comme telle malist = ATME.C_IndexList()

 

il faut faire autrement. elle vient de où cette table " blueTargetsListe" générée par une fonction ATME ?

 

il est probable voir certain, que les tables générées en sortie par des fonctions ATME ayant cette sortie soient indexées.

c'est à dire et c'est tout le principe de la table indexée: avec des index fixes même si la valeur a changé ou est nil

 

extrait du manuel " Cette classe permet de créer une liste indexée pouvant contenir des valeurs nil. L’index sera

forcément numérique et débutera à 1. ATME.C_IndexList permet une gestion optimisée de ces

listes.

Contrairement table.removequi engendre une modification des index suivant l’élément supprimé,

ATME.C_IndexList met simplement à nil l’élément supprimé. Cette entrée devient alors valable

pour la prochaine insertion. De plus, ceci évite de perdre un éventuel référencement au travers de

l’index." --> l'interet est que ci l'on stocke à un index donné un objet ATME-DCS même si il devient nil l'index existe toujours sans décaler les autres . on peut donc tester si le group est détruit ou pas par exemple.

 

usage de cette forme pour trier le meilleur moyen est de créer une nouvelle liste indexée selon des critères de tri.

 

--première boucle

for i,value in (matableindexée):pairs do

-- deuxieme boucle

for a,value2 in (matableindexée):pairs do

if value2<value then ... -- critère de tri

 

 

un exemple récent de ma part un peu complexe et obscur ( lourd et non optimisé mais qui fonctionne nickel ) dans mon module de monitoring des ground target, peut être ça aidera a comprendre comment on peut jouer avec les listes indexées

souvent je crée une nouvelle table indexée de correspondance selon un tri donné, par exemple sur cette nouvelle table de correspondance , à l'index 1 de cette nouvelle liste j'ai stocké la valeur index 16 qui correspond ici à l'index des data avec la plus petite valeur de distance par rapport au joueur dans les datas stockée,( je les associe à une liste data standard lua non indexée lorsque j'ai trop de datas, ...et par facilité d'accès.)

 

 

 

--____________________________________

local function tri(parcategory,active) --/ true or false or nil / true false nil

 

 

local newtri1_distance = ATME.C_IndexList()

local newtri2_parameteractive = ATME.C_IndexList()

local newtri3_parametercategory = ATME.C_IndexList()

local categorytable = {}

local listcategory = ATME.C_IndexList()

local dist = 100000

local dist2 = 0

local b = ATME.modules["DATA_target"].TARGETindexlist:getCount()

thisModule:output("nb objet dans la table TARGETindexlist "..b,1)

local indexclosest = ""

 

 

 

--make new list for newtri1_distance ( fait par default)

for i=1,b do

dist = 100000

--research closest

for _i,_items in ATME.modules["DATA_target"].TARGETindexlist:pairs() do

 

if ATME.modules["DATA_target"].TARGETdata[_i]["dist"] <= dist and ATME.modules["DATA_target"].TARGETdata[_i]["dist"]> dist2 then

dist = ATME.modules["DATA_target"].TARGETdata[_i]["dist"]

indexclosest = _i

end

end

thisModule:output(" iteration "..i,1)

dist2 = dist

newtri1_distance:add(indexclosest)

thisModule:output(" added in newtri1 distance "..indexclosest,1)

end

 

--newtri2_parameter1 ( fait par defaut )

if active == nil then

newtri2_parameteractive = newtri1_distance

 

elseif active == true or active == false then

 

for _i,index in newtri1_distance:pairs() do

 

if ATME.modules["DATA_target"].TARGETdata[index]["status"] == active then

newtri2_parameteractive:add(index)

thisModule:output("added in newtri2 "..index.."because "..(ATME.modules["DATA_target"].TARGETdata[index]["objectname"]).." status is "..tostring(active),1)

end

end

 

end

 

--newtri3_parametercategory

 

--get category table

 

for _i,index in newtri2_parameteractive:pairs() do

 

 

if categorytable[(ATME.modules["DATA_target"].TARGETdata[index]["menucategory"])] == nil then

categorytable[(ATME.modules["DATA_target"].TARGETdata[index]["menucategory"])] = ATME.C_IndexList()

listcategory:add((ATME.modules["DATA_target"].TARGETdata[index]["menucategory"]))

categorytable[(ATME.modules["DATA_target"].TARGETdata[index]["menucategory"])]:add(index)

thisModule:output("added in newtri3 "..index.."because "..(ATME.modules["DATA_target"].TARGETdata[index]["objectname"]).." menucategory is "..(ATME.modules["DATA_target"].TARGETdata[index]["menucategory"]),1)

else

categorytable[(ATME.modules["DATA_target"].TARGETdata[index]["menucategory"])]:add(index)

thisModule:output("added in newtri3 "..index.."because "..(ATME.modules["DATA_target"].TARGETdata[index]["objectname"]).." menucategory is "..(ATME.modules["DATA_target"].TARGETdata[index]["menucategory"]),1)

end

end

 

 

for i,category in listcategory:pairs() do

thisModule:output(" functiontri in listcategory "..i.." "..category,1)

end

 

 

 

if type(parcategory) == string and categorytable[parcategory] ~= nil then

 

newtri3_parametercategory = categorytable[parcategory]

 

else

 

newtri3_parametercategory = newtri2_parameteractive

 

end

 

for i,index in newtri3_parametercategory:pairs() do

--thisModule:output("functiontri in final table return only "..i.." "..index ,1)

thisModule:output("corresponding with "..(ATME.modules["DATA_target"].TARGETdata[index]["objectname"]).." "..(ATME.modules["DATA_target"].TARGETdata[index]["classnameofobject"]).." "..(ATME.modules["DATA_target"].TARGETdata[index]["menucategory"]),1)

end

 

 

return

newtri3_parametercategory,listcategory,categorytable

 

 

end

 

 


Edited by snowsniper

[sIGPIC][/sIGPIC]

all my skins :

here

 

Core i7-4790 @ 3.6- 4GHz - 16GB

- nVidia RTX 2070 - 2xSSD -

GRANDIN TV screen 39" in 1920x1080 cockpit scale 1:1

- MS FFB2 Joystick

- DIY MIDI Throttle with 14 analogic sliders and knobs

- Saitek Pro Flight Rudder Pedals

 

Link to comment
Share on other sites

la table indexée reste idéale pour du référencement identique et fiable d'objet, référencement utilisé ensuite dans plusieurs tables classiques ou pas;

à toi de voir mais rien de très compliqué une fois qu'on a compris

[sIGPIC][/sIGPIC]

all my skins :

here

 

Core i7-4790 @ 3.6- 4GHz - 16GB

- nVidia RTX 2070 - 2xSSD -

GRANDIN TV screen 39" in 1920x1080 cockpit scale 1:1

- MS FFB2 Joystick

- DIY MIDI Throttle with 14 analogic sliders and knobs

- Saitek Pro Flight Rudder Pedals

 

Link to comment
Share on other sites

Oui, la classe C_IndexList permet de gérer de s'assurer qu'un index ne change pas.

Exemple : Si après un insert, l'index de l'objet est 3, si l'objet 2 est supprimé, l'index restera 3 et l'index 2 est libre pour une utilisation ultérieure. Elle permet donc ainsi que gérer des listes indexées dont l'index est fixe même après une suppression tout en pouvant réassigner les "trous" dans la liste lors d'un prochain insert.

 

Cette classe de par sa conception n'a pas besoin de fonction de tri.

 

Pour trier, il faut effectivement copier dans une autre table et trié en fonction du contenu.

 

A+

Link to comment
Share on other sites

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...