Sorting Tables and Spitting out Data

Posted by Strazor on Thu 30 Oct 2014 09:24 PM — 12 posts, 39,494 views.

USA #0
I have a table called 'tdata' with the following information.

"LIGHT"=0
"SONIC"=-92
"NEGATIVE"=0
"HOLY"=0
"SLASH"=0
"MENTAL"=0
"EARTH"=-80
"MAGIC"=0
"AIR"=0
"FIRE"=0
"ELECTRIC"=-300
"WATER"=248
"ACID"=0
"SHADOW"=0
"BASH"=0
"PIERCE"=0
"POISON"=0
"COLD"=136
"ENERGY"=0
"DISEASE"=0


I use the following to sort the data ascending.


t = {}

for k, v in pairs (tdata) do
      table.insert (t, k) 
  end -- for

table.sort (t, function (c, d) return tdata [c] < tdata [d] end)
table.foreach (t, print)


This above sorts the table correctly and outputs the following in the correct Ascending order:


1 ELECTRIC
2 SONIC
3 EARTH
4 LIGHT
5 ACID
6 SHADOW
7 BASH
8 POISON
9 PIERCE
10 ENERGY
11 FIRE
12 DISEASE
13 AIR
14 NEGATIVE
15 SLASH
16 HOLY
17 MAGIC
18 MENTAL
19 COLD
20 WATER


Here is where I'm having trouble visualizing the next step. I want to be able to do two things.
1) I want the value of each damage type listed. (ie, '2 SONIC -92' from above data)
2) I want to be able to ColourNote each line based on a value. For instance, if value is < 0 make the text green. Using the above data it would make '2 Sonic -92' a green color.

Any suggestions ?

Much Thanks for reading.
Amended on Thu 30 Oct 2014 09:27 PM by Strazor
USA #1
I'd probably go with an if check nested in your sort routine.

Something like

  for k, v in pairs (tdata) do
      if k < 0 
          table.insert ColorNote(t, k)
       else
          table.insert (t, k)
       end -- if
  end -- for


Guarantee the colornote syntax is off but you get the general isea
USA #2
That is a great idea for printing the data. I still have the issue of the sorted table not listing all the data.

Your first idea worked great:


for k, v in pairs (tdata) do
      if v <= 0 then
          ColourNote ("#bbbbbb", "white", k,
                      "#bbbbbb", "white", "  ",
                      "#bbbbbb", "white", v)
      elseif
         v > 0 then
                      ColourNote ("#bbbbbb", "red", k,
                      "#bbbbbb", "red", "  ",
                      "#bbbbbb", "red", v)
          ColourNote ("#bbbbbb", "red", k)
      end
end

OUTPUT - You can't see the colors but they are there

LIGHT  0
SONIC  -92
NEGATIVE  0
HOLY  0
SLASH  0
MENTAL  0
EARTH  -80
MAGIC  0
AIR  0
FIRE  0
ELECTRIC  -300
WATER  248
ACID  0
SHADOW  0
BASH  0
PIERCE  0
POISON  0
COLD  136
ENERGY  0
DISEASE  0



What I need now is the sorted table to print correctly. How can I display the values from tdata in t (referenced in my first post)? I want to take the above data and do this.


1 ELECTRIC -300
2 SONIC -92
3 EARTH -80
4 LIGHT 0
5 ACID 0
6 SHADOW 0
7 BASH 0
8 POISON 0
9 PIERCE 0
10 ENERGY 0
11 FIRE 0 
12 DISEASE 0
13 AIR 0 
14 NEGATIVE 0
15 SLASH 0
16 HOLY 0
17 MAGIC 0
18 MENTAL 0
19 COLD 136
20 WATER 248
Amended on Fri 31 Oct 2014 12:21 AM by Strazor
USA #3
Offhand, I don't even see what's keeping it from printing both values properly but you didn't provide all of the code for us to see if there's an issue with assigning the values for printing. I offered a suggestion for the problem I might actually have known something useful about :)
USA #4
I'm not sure what else I can add. I've included the table data from tdata. I then provided the code that is used to sort 'tdata' into table 't'. I've shown the code and the results from table 't' but it does not print the attribute data listed in 'tdata'.

In table tdate you get.

"LIGHT"=0
"SONIC"=-92
"NEGATIVE"=0
and so on

Then sorted in table 't'
1 SONIC 
2 LIGHT
3 NEGATIVE
and so on


All of the code I am using is listed in my posts above. I'm trying to figure out how to get the following output from the sorted table 't'.

1 SONIC -92
2 LIGHT  0
3 NEGATIVE  0


Thanks for any help.
Amended on Fri 31 Oct 2014 02:26 AM by Strazor
USA #5
The problem may be how I'm listing the data. I'm going to reorder my table this way and see if the data lists correctly.


tdata = {
    { type = bash, resist = 0 },
    { type = pierce, resist = 5 }
    }

table.sort (tdata, function (k1, k2) return k1.resist < k2.resist end )

table.foreachi (tdata, function (k, v) table.foreach (v, print) end )


How would I update bash and resist in tdata from a variable called by a trigger?


Function Example(name, line, wildcards)
     varType = wildcards[1]
     varResist = tonumber(wildcards[2])
     tdata.type = varType
     tdata.resist = varResist
end -- end function



Would the above function successfully update a table with multiple variables like this?
Amended on Fri 31 Oct 2014 03:47 AM by Strazor
Australia Forum Administrator #6
How about this?


tdata = {
        LIGHT=0,
        SONIC=-92,
        NEGATIVE=0,
        HOLY=0,
        SLASH=0,
        MENTAL=0,
        EARTH=-80,
        MAGIC=0,
        AIR=0,
        FIRE=0,
        ELECTRIC=-300,
        WATER=248,
        ACID=0,
        SHADOW=0,
        BASH=0,
        PIERCE=0,
        POISON=0,
        COLD=136,
        ENERGY=0,
        DISEASE=0,
        }

tsorted = {}

for k, v in pairs (tdata) do
      table.insert (tsorted , k) 
  end -- for

table.sort (tsorted)  -- defaults to ascending

-- read sorted table
for k, v in ipairs (tsorted) do
  val = tdata [v]  -- get value from other table
  if val < 0 then
    col = "green"
  elseif val < 100 then
    col = "magenta"
  else
    col = "lightblue"
  end -- if
  ColourNote (col, "", v .. " = " .. val)
end -- for


Output:


ACID = 0
AIR = 0
BASH = 0
COLD = 136
DISEASE = 0
EARTH = -80
ELECTRIC = -300
ENERGY = 0
FIRE = 0
HOLY = 0
LIGHT = 0
MAGIC = 0
MENTAL = 0
NEGATIVE = 0
PIERCE = 0
POISON = 0
SHADOW = 0
SLASH = 0
SONIC = -92
WATER = 248


Coloured too.
Amended on Fri 31 Oct 2014 04:13 AM by Nick Gammon
USA #7
Wow Nick that's great. Can the data be sorted ascending by the values?
Australia Forum Administrator #8
Sure, like this:


tdata = {
        LIGHT=0,
        SONIC=-92,
        NEGATIVE=0,
        HOLY=0,
        SLASH=0,
        MENTAL=0,
        EARTH=-80,
        MAGIC=0,
        AIR=0,
        FIRE=0,
        ELECTRIC=-300,
        WATER=248,
        ACID=0,
        SHADOW=0,
        BASH=0,
        PIERCE=0,
        POISON=0,
        COLD=136,
        ENERGY=0,
        DISEASE=0,
        }

tsorted = {}

for k, v in pairs (tdata) do
      table.insert (tsorted , k) 
  end -- for

table.sort (tsorted, function (a, b) return tdata [a] < tdata [b] end)
-- read sorted table
for k, v in ipairs (tsorted) do
  val = tdata [v]  -- get value from other table
  if val < 0 then
    col = "green"
  elseif val < 100 then
    col = "magenta"
  else
    col = "lightblue"
  end -- if
  ColourNote (col, "", v .. " = " .. val)
end -- for


Output:


ELECTRIC = -300
SONIC = -92
EARTH = -80
SLASH = 0
SHADOW = 0
ENERGY = 0
BASH = 0
PIERCE = 0
MAGIC = 0
DISEASE = 0
MENTAL = 0
FIRE = 0
HOLY = 0
LIGHT = 0
NEGATIVE = 0
POISON = 0
AIR = 0
ACID = 0
COLD = 136
WATER = 248
Australia Forum Administrator #9
Although it's probably better to sort into values first and then if the value is the same, sort alphabetically:


tdata = {
        LIGHT=0,
        SONIC=-92,
        NEGATIVE=0,
        HOLY=0,
        SLASH=0,
        MENTAL=0,
        EARTH=-80,
        MAGIC=0,
        AIR=0,
        FIRE=0,
        ELECTRIC=-300,
        WATER=248,
        ACID=0,
        SHADOW=0,
        BASH=0,
        PIERCE=0,
        POISON=0,
        COLD=136,
        ENERGY=0,
        DISEASE=0,
        }

tsorted = {}


-- k = key, v = value
for k, v in pairs (tdata) do
      table.insert (tsorted , k) 
  end -- for

table.sort (tsorted, function (a, b) 
   if tdata [a] == tdata [b] then
     return a < b
   end -- if values the same
   return tdata [a] < tdata [b] 
   end)

-- read sorted table
-- k = key, v = value
for k, v in ipairs (tsorted) do
  val = tdata [v]  -- get value from other table
  if val < 0 then
    col = "green"
  elseif val < 100 then
    col = "magenta"
  else
    col = "lightblue"
  end -- if
  ColourNote (col, "", v .. " = " .. val)
end -- for


Output:



ELECTRIC = -300
SONIC = -92
EARTH = -80
ACID = 0
AIR = 0
BASH = 0
DISEASE = 0
ENERGY = 0
FIRE = 0
HOLY = 0
LIGHT = 0
MAGIC = 0
MENTAL = 0
NEGATIVE = 0
PIERCE = 0
POISON = 0
SHADOW = 0
SLASH = 0
COLD = 136
WATER = 248
Amended on Fri 31 Oct 2014 08:26 PM by Nick Gammon
Australia Forum Administrator #10


ELECTRIC = -300
SONIC = -92
EARTH = -80
ACID = 0
AIR = 0
BASH = 0
DISEASE = 0
ENERGY = 0
FIRE = 0
HOLY = 0
LIGHT = 0
MAGIC = 0
MENTAL = 0
NEGATIVE = 0
PIERCE = 0
POISON = 0
SHADOW = 0
SLASH = 0
COLD = 136
WATER = 248
Amended on Fri 31 Oct 2014 05:04 AM by Nick Gammon
USA #11
Thank you Nick. Very helpful and much appreciated.