2013-06-24 5 views
2

слегка измененный вариант ниже позволила мне отфильтровать уникальные значения поля из многомерной таблицы (dictionarry стиля)поиск дубликатов в многомерной таблице

[URL] http://rosettacode.org/wiki/Remove_duplicate_elements#Lua

items = {1,2,3,4,1,2,3,4,"bird","cat","dog","dog","bird"}` 
flags = {} 
io.write('Unique items are:') 
for i=1,#items do 
if not flags[items[i]] then 
    io.write(' ' .. items[i]) 
    flags[items[i]] = true 
end 
end 
io.write('\n')` 

То, что я потерял, это то, что «если нет ... тогда ... конец» на самом деле. Для меня это глупо, но эй, это работает ;-) Теперь я хочу знать, что происходит под капотом.

Надеюсь, что многомерный никого не обидит, я имею в виду таблицу, состоящую из нескольких строк, содержащих несколько пар ключ-значение в каждой строке.

Вот код, я не буду использовать, не блестящие адаптации, но достаточно хорошо, чтобы отфильтровать уникальные значения на имя_поле

for i=1,#table,1 do 

if not table2[table[i].fieldname] then 
    table2[table[i].fieldname] = true 
end 
end 

for k,v in pairs(table2) do 
    print(k) 
end 
+0

Возможно, вы отреагировали на свой вопрос с помощью редактирования. Пожалуйста, сделайте ответ и примите его. –

+1

Не используйте 'table' как имя переменной. – hjpotter92

+0

@ hjpotter92 Я использую таблицу, чтобы проиллюстрировать код, так как я делаю с именем поля –

ответ

0

В конце концов это код, который работал для меня. Меня попросили отправить его в виде отдельного ответа, так что здесь.

for i=1,#table1,1 do 

if not table2[table1[i].fieldname] then 
    table2[table1[i].fieldname] = true 
end 
end 

for k,v in pairs(table2) do 
    print(k) 
end 
0
function findDuplicates(t) 
    seen = {} --keep record of elements we've seen 
    duplicated = {} --keep a record of duplicated elements 
    for i = 1, #t do 
     element = t[i] 
     if seen[element] then --check if we've seen the element before 
      duplicated[element] = true --if we have then it must be a duplicate! add to a table to keep track of this 
     else 
      seen[element] = true -- set the element to seen 
     end 
    end 
    return duplicated 
end 

Логик if seen[element] then, является то, что мы проверяем, если мы уже видел элемент перед в таблице. Как будто ключ не существует nill будет возвращен, который оценивается как ложный (это не то же, что и boolean false, существует два типа ложных в lua!).

Вы можете использовать эту функцию, например, так:

t = {'a','b','a','c','c','c','d'} 
for key,_ in pairs(findDuplicates(t)) do 
    print(key) 
end 

Однако эта функция не будет работать с многомерными таблицами, это один будет, однако:

function findDuplicates(t) 
    seen = {} --keep record of elements we've seen 
    duplicated = {} --keep a record of duplicated elements 
    local function traverse(subt) 
     for i=1, #subt do 
      element = subt[i] 
      if type(element) == 'table' then 
       traverse(element) 
      else 
       if seen[element] then 
        duplicated[element] = true 
       else 
        seen[element] = true 
       end 
      end 
     end 
    end 
    traverse(t) 
    return duplicated 
end 

Пример Useage:

t = {'a',{'b','a'},'c',{'c',{'c'}},'d'} 
for k,_ in pairs(findDuplicates(t)) do 
    print(k) 
end 

Выходы

a 
c 

t = {a='a',b='b',c='c',d='c',e='a',f='d'} 

function findDuplicates(t) 
    seen = {} 
    duplicated = {} 
    for key,val in pairs(t) do 
     if seen[val] then 
      duplicated[val] = true 
     else 
      seen[val] = true 
     end 
    end 
    return duplicated 
end 

Это работает точно так же, как и раньше, но проверяет тот же значение связано с другим ключом и если да, то делает к сведению, что значения, как дублируются.

+0

Спасибо. Я начинающий программист, поэтому я использовал многомерную формулировку здесь. Я все еще привыкаю к ​​необработанной силе lua предлагает ;-) Порой это сложно контролировать ;-) Моя таблица выглядит как {{field1 = "value1", field2 = "value2", ... ., field9 = "value9"},
{field1 = "value1", field2 = "value2", ...., field9 = "значение9"} ....} –

+0

@SaintCrusty не беспокоится. Lua был моим первым языком :) Время от времени это было очень неприятно. Понимание таблиц на самом деле довольно сложно, кажется, легко, как только вы это сделаете, но я знаю, что я очень много боролся. Это и metatables! Придерживайтесь этого, хотя :) Если это ответили на ваш вопрос, вы должны принять его. О, я буду обновлять свой ответ соответственно! – HennyH

+0

@ SaintCrusty это лучше? – HennyH