2012-03-17 2 views
3

オブジェクトのインデックスを印刷()したり見つけたりするにはどうすればよいですか?例えばルアでは、オブジェクトが格納されているキーはどうやって見つけられますか?

、私は私が見つけるだろうか、このRockTable[#RockTable + 1] = rock;

そして、すべての20個の岩のようにRockTable = {};

が画面に表示されている配列に、画面上の20個のランダムなロックオブジェクトを生み出した場合にどのようなキーまたはインデックスの各岩をそれらをクリックしていますか?

私はコロナSDKを使用しています。

ご協力いただければ幸いです。

答えて

0

残念ながら、私の知る限り、テーブルをブルートする必要があります。あなたがクリックされたことを知るには、とにかく何らかの方法でそれらをループする必要はありません。したがって、すでにインデックスを知っていますか?

編集

ああ、コロナは、クリックのためのコールバックイベントのいくつかの並べ替えを持っていない限り。私はそれを使用したことがない、私はルアで経験を持っている。

あなたは多分そうのように、後方参照を行うことができます:

Rocks = {a rock, a rockB, a rockC} 
RocksB = {[a rock] = 1, [a rockB] = 2, [a rockC] = 3} 

をそれからちょうど言うrockNum = RocksB [ロック]

私は仕事べきであるかなり確信しているが、私はそれを保証することはできませんしかし、試してみる価値がある。

EDIT2

はブルート方法は多少のようになります。

function getRock(rock) 
    for _,v in pairs(rocks) do 
     if (v == rock) 
      return _ 
     end 
    end 
    return "Rock does not exist." 
end 
+1

ここで書いたように、 'Rocks'と' RocksB'は同じ配列です。あなたは 'RocksB'のインデックスと値を' {[a rock] = 1、... 'として逆転させたいと思っていました。 – RBerteig

+0

@RBerteig Oh yeah;私はそれを信じられません。それを指摘してくれてありがとう。 –

1

を、あなたはあなたに常にインデックスを見つけるためにテーブルをループのいくつかのトラブルを保存するには、このような何かを行うことができます...

RockTable = {} 
RockIndicies = {} 

for i = 1, 20 do 
    idx = #RockTable + 1 
    RockTable[idx] = rock 
    RockIndicies[rock] = idx 
end 

インデックスを知る必要があるときは、すぐにRockIndicesのインデックスを作成する必要があります。あなたが岩を「削除する」場合は、両方の場所でそれを削除することを確認したいでしょう。

4

反転テーブルは:

function table_invert(t) 
    local u = { } 
    for k, v in pairs(t) do u[v] = k end 
    return u 
end 

あなたは、インデックスを見つけるために、反転テーブルを使用することができます。

私はこの機能が非常に便利で、私の永続的な "Lua utilities"ライブラリに入っています。

2

metamethodsを使用して別の方法で行うことができます。 はあなたがt値をコピーして、あなたとそれを取ることができるとして、それは、より汎用性の高いです

t = {} -- Create your table, can be called anything 
t.r_index = {} -- Holds the number value, i.e. t[1] = 'Foo' 
t.r_table = {} -- Holds the string value, i.e. t['Foo'] = 1 

mt = {} -- Create the metatable 
mt.__newindex = function (self, key, value) -- For creating the new indexes 
    if value == nil then -- If you're trying to delete an entry then 
     if tonumber(key) then -- Check if you are giving a numerical index 
      local i_value = self.r_index[key] -- get the corrosponding string index 
      self.r_index[key] = nil -- Delete 
      self.r_table[i_value] = nil 
     else -- Otherwise do the same as above, but for a given string index 
      local t_value = self.r_table[key] 
      self.r_index[t_value] = nil 
      self.r_table[key] = nil 
     end 
    else 
     table.insert(self.r_index, tonumber(key), value) -- For t[1] = 'Foo' 
     self.r_table[value] = key -- For t['Foo'] = 1 
    end 
end 
mt.__index = function (self, key) -- Gives you the values back when you index them 
    if tonumber(key) then 
     return (self.r_index[key]) -- For For t[1] = 'Foo' 
    else 
     return (self.r_table[key]) -- For t['Foo'] = 1 
    end 
end 

setmetatable(t, mt) -- Creates the metatable 

t[1] = "Rock1" -- Set the values 
t[2] = "Rock2" 

print(t[1], t[2]) -- And *should* proove that it works 
print(t['Rock1'], t['Rock2']) 

t[1] = nil 
print(t[1], t[2]) -- And *should* proove that it works 
print(t['Rock1'], t['Rock2']) 

[あなたはあまりにも値を削除できるようにするために編集されました]。ほとんどの場合、1つの変数で遊ぶだけで済むことを意味します。うまくいけば、間違ったことにアクセスしようとする可能性を減らすことができます。

2

最も簡単な方法は、それぞれの岩に「インデックス」プロパティを追加することです:

RockTable = {} 

for i=1,20 do 

    local rock 
    -- do your thing that generates a new 'rock' object 

    rock.index = #RockTable + 1 
    RockTable[rock.index] = rock 

end 

あなたはタッチリスナーメソッドを使用する場合は、この方法岩を取得できます。

function touchListener(event) 
    local rock = event.target 
    local rockIndex = rock.index 
    -- ... 
end 

それは、インデックス付きの2番目のテーブルを維持することは可能ですが、私のメソッドはより洗練されています。つまり、物事を取り除くときは、1つのテーブル、つまりメインテーブルだけを心配する必要があります。

私は質問があります:なぜあなたはそのインデックスを取得する必要がありますか?ほとんどの場合、うまく設計されたイベントリスナー関数で十分です。オブジェクトを「見つける」必要はありません。もちろん、あなたがしようとしていることについての情報が不足していますが、あなたが過度に複雑なことが起こっている可能性があります。

関連する問題