Announcement

Collapse
No announcement yet.

ATME (1.46) : indexlist

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    ATME (1.46) : indexlist

    Hello,

    Je voudrais savoir s'il est possible d'appliquer un table.sort sur une liste ATME ?

    ++


    Edit : Bon j'aurais du tester avant de demander... Bref réponse : OUI
    Last edited 01-27-2019, 06:02 PM.

    #2
    Doublons...
    Voir dessous

    Comment


      #3
      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.

      Code:
      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...

      Code:
          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
      Last edited 01-27-2019, 06:39 PM.

      Comment


        #4
        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.)

        Spoiler:

        --____________________________________
        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
        Last edited 01-27-2019, 09:04 PM.
        sigpic
        all my skins :

        here
        Spoiler:
        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

        Comment


          #5
          Salut snowsniper,

          ha oui j'avais pas capté ca.... donc normal que ca ne trie pas...

          Ca va me compliquer pas mal la vie cette affaire...

          Je vais peut-etre repasser a une table Lua classique dans ce cas la.

          Merci quand même pour les conseils

          Comment


            #6
            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
            all my skins :

            here
            Spoiler:
            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

            Comment


              #7
              Hello,


              Oui j'ai réglé ca en trois lignes de code
              Code:
                  for _i, _item in blueTargetsListe:pairs() do 
                      table.insert(temptab,_item)
                  end
                  sortnested(temptab, "incr", 3)

              Comment


                #8
                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+

                Comment

                Working...
                X