2012-01-04 9 views
5

Sto tentando di confrontare due tabelle di uguale lunghezza con una funzione, poiché non conosco altro modo per farlo. Tuttavia, con la seguente funzione, non riesce a registrarsi e non ho idea del perché. Spero che qualcuno possa fornire informazioni su questo problema o avere un modo migliore di confrontare le due tabelle.Confronto di due tabelle indice per valore indice in lua

Le tabelle vengono popolati con il seguente codice:

str = "parameters determined by program (all digits)" 
tableone = {} 
for word in str:gmatch("%d") do table.insert(tableone,word) end 

È identica per entrambe le tabelle, ad eccezione, ovviamente, i singoli nomi di tabella. Le tabelle vengono compilate correttamente e vengono visualizzate correttamente quando le stampo. Qui ci sono due tavoli per il bene di questa domanda:

tableone = {} 
tabletwo = {} 
for i=1,4 do table.insert(tableone, i) end 
for i=1,4 do table.insert(tabletwo, i) end 

Ovviamente, queste due tabelle stanno per essere uguali tra loro. La funzione che ho scritto per confrontare le tabelle di indice è la seguente:

function comparetables(t1, t2) 
matchct = 0 
for i=1,#t1 do 
    if t1[i] == t2[i] then 
    matchct = matchct + 1 
    end 
if matchct == #t1 then 
return true 
end 
end 

Ho provato a fare

print(comparetables(tableone,tabletwo)) 

per vedere se sarà stampare "vera", ma senza fortuna. Per me, sembra che dovrebbe funzionare senza problemi. Eppure non è così. Cosa mi manca? Ho provato a cercare qualcosa come una funzione table.compare che qualcuno potrebbe aver già scritto, ma nessuna fortuna nel trovarne una. Grazie per eventuali suggerimenti!

Ulteriori informazioni:

La ragione per cui sto confrontando le tabelle è per un gioco mastermaind-tipo. Ciò significa che le seguenti tre regole devono essere applicate quando si confrontano le tabelle. La funzione che ho creato è stata solo iniziare, pensando di poter lavorare da lì.

  1. Confrontando i tavoli, se i numeri corrispondono, CCOUNT aumenta di 1.
  2. Quando si confrontano le tabelle, se il valore esiste in una posizione di indice diverso, incremento Pcount da 1

Ad esempio , con una tabella di valori {1, 3, 3, 4} e un'ipotesi di {4, 4, 3, 1}, restituirà Pcount di 2 (il 4 e il 1) e un Conto 1 (il tre nella terza posizione). Penso che una delle parti più difficili sarà ottenere il confronto per riconoscere che il secondo 4 nell'ipotesi non dovrebbe affatto incrementare il Pcount.

risposta

3

Se si sta confrontando gli oggetti che sono più objecty di Tabley in senso Object oriented, quindi vi consiglio di cercare di implementare le funzioni in il modo lua OO.

Qualcosa del genere dovrebbe fare il trucco:

GameState = {} 
GameState.mt = {} 
GameState.mt.fns = {} 
GameState.mt.__index = GameState.mt.fns 

function GameState.new(a,b,c,d) 
-- TODO: put argument checks here... 
    local retval = {} 
    retval[1] = a 
    retval[2] = b 
    retval[3] = c 
    retval[4] = d 
    setmetatable(retval, GameState.mt) 
    return retval 
end 

function GameState.mt.fns.print(self) 
    print(" GameState: ", self[1], self[2], self[3], self[4]) 
end 

function GameState.mt.__tostring(self) 
    return "GameState: "..self[1].." "..self[2].." "..self[3].." "..self[4] 
end 

function GameState.mt.__eq(self, other) 
    -- Check it's actually a GameState, and all its bits match 
    return getmetatable(other)==GameState.mt and 
    (self[1] == other[1]) and 
    (self[2] == other[2]) and 
    (self[3] == other[3]) and 
    (self[4] == other[4]) 
end 

Allora devi usare in questo modo:

state1 = GameState.new(1,2,3,4) 
state2 = GameState.new(1,2,3,4) 

print("State 1 is:") 
state1:print() 

print("State 2 is:") 
print(state2) 

print("state1 == state2 : ", state1 == state2) 

print("Changing state 2") 
state2[1]=2 

print("state1 == state2 : ", state1 == state2) 
+0

Da dove viene il "sé"? Ho appena provato e ha restituito un errore dicendo che stava tentando di indicizzare auto locale, un valore nullo. Edit: Oh, aspetta, lo vedo nel primo blocco. Strano che restituisca un errore, però. – Josh

+0

@Josh dove vedi un errore? (Ho provato questo sulla mia copia di lua e funziona senza errori). –

+0

(\ n sta solo indicando la nuova riga poiché i commenti non consentono le multilinea) Usando wxLuaeditor ed entrambe le sezioni di codice sopra, restituisce questo: Stato 1 è: \ n Errore: Lua: Errore durante l'esecuzione di chunk \ n [stringa "* untitled.lua"]: 18: tentativo di indicizzare 'self' locale (valore nullo) \ n trace traceback: \ n [stringa "* untitled.lua"]: 18: in funzione 'print' \ n [stringa "* untitled.lua"]: 37: nel blocco principale – Josh

5

Una leggera variante sul vostro codice che dovrebbe funzionare è:

function comparetables(t1, t2) 
    if #t1 ~= #t2 then return false end 
    for i=1,#t1 do 
    if t1[i] ~= t2[i] then return false end 
    end 
    return true 
end 

Comunque io uso qualcosa di più simile a questo: Controlla i tipi di argomenti, i loro metatables, e pochi altri casi.

-- This is not clever enough to find matching table keys 
-- i.e. this will return false 
-- recursive_compare({ [{}]:1 }, { [{}]:1 }) 
-- but this is unusual enough for me not to care ;) 
-- It can also get stuck in infinite loops if you use it on 
-- an evil table like this: 
--  t = {} 
--  t[1] = t 

function recursive_compare(t1,t2) 
    -- Use usual comparison first. 
    if t1==t2 then return true end 
    -- We only support non-default behavior for tables 
    if (type(t1)~="table") then return false end 
    -- They better have the same metatables 
    local mt1 = getmetatable(t1) 
    local mt2 = getmetatable(t2) 
    if(not recursive_compare(mt1,mt2)) then return false end 

    -- Check each key-value pair 
    -- We have to do this both ways in case we miss some. 
    -- TODO: Could probably be smarter and not check those we've 
    -- already checked though! 
    for k1,v1 in pairs(t1) do 
    local v2 = t2[k1] 
    if(not recursive_compare(v1,v2)) then return false end 
    end 
    for k2,v2 in pairs(t2) do 
    local v1 = t1[k2] 
    if(not recursive_compare(v1,v2)) then return false end 
    end 

    return true 
end 

Ecco un esempio di esso in uso:

print(recursive_compare({1,2,3,{1,2,1}}, {1,2,3,{1,2,1}})) -- prints true 
print(recursive_compare({1,2,3,{1,2,1}}, {2,2,3,{1,2,3}})) -- prints false 
+0

sto assumendo c'è una errant "per" il primo codice. Probabilmente avrei dovuto menzionare la ragione per cui sto confrontando le tabelle. Sto creando un gioco di tipo mastermind, quindi è necessario controllare i valori in a.) Vedere se corrispondono tutti, b.) Vedere se c'è una corrispondenza, e se lo fanno, tenere traccia di quanti e c.) vedere se i numeri esistono nella tabella e tenere traccia di quel conteggio. Aggiornerà la domanda con le informazioni. – Josh

+0

@Josh oops extra per era un errore di copia/incolla - risolto ora. –

+0

@Josh sembra che tu stia confrontando stati piuttosto che tabelle generiche. In tal caso probabilmente vorresti usare un po 'di magia OO lua per farlo. Lo sottolineerò in una seconda risposta. –