swaechter
swaechter

Reputation: 1439

Two index with one value in a lua table

I am very new to lua and my plan is to create a table. This table (I call it test) has 200 entries - each entry has the same subentries (In this example the subentries money and age):

This is a sort of pseudocode:

table test = {
    Entry 1: money=5 age=32
    Entry 2: money=-5 age=14
    ...
    Entry 200: money=999 age=72
}

How can I write this in lua ? Is there a possibility ? The other way would be, that I write each subentry as a single table:

table money = { }
table age = { }

But for me, this isn't a nice way, so maybe you can help me.

Edit:

This question Table inside a table is related, but I cannot write this 200x.

Upvotes: 0

Views: 1456

Answers (3)

catwell
catwell

Reputation: 7020

You mean you do not want to write "money" and "age" 200x?

There are several solutions but you could write something like:

local test0 = {
  5, 32,
  -5, 14,
  ...
}

local test = {}

for i=1,#test0/2 do
  test[i] = {money = test0[2*i-1], age = test0[2*i]}
end

Otherwise you could always use metatables and create a class that behaves exactly like you want.

Upvotes: 0

jpjacobs
jpjacobs

Reputation: 9549

You can also turn the problem on it's side, and have 2 sequences in test: money and age where each entry has the same index in both arrays.

test = {
   money ={1000,100,0,50},
   age={40,30,20,25}
}

This will have better performance since you only have the overhead of 3 tables instead of n+1 tables, where n is the number of entries.

Anyway you have to enter your data one way or another. What you'd typically do is make use some easily parsed format like CSV, XML, ... and convert that to a table. Like this:

s=[[
1000 40
 100 30
   0 20
  50 25]]
test ={ money={},age={}}
n=1
for balance,age in s:gmatch('([%d.]+)%s+([%d.]+)') do
   test.money[n],test.age[n]=balance,age
   n=n+1
end 

Upvotes: 0

kikito
kikito

Reputation: 52648

Try this syntax:

test = {
  { money = 5, age = 32 },
  { money = -5, age = 14 },
  ...
  { money = 999, age = 72 }
}

Examples of use:

-- money of the second entry:
print(test[2].money) -- prints "-5"

-- age of the last entry:
print(test[200].age) -- prints "72"

Upvotes: 5

Related Questions