Lua Сравните несколько значений таблицы

Здравствуйте, у меня есть таблица вроде

list[i].font_name

i - неопределенное число, я хочу проанализировать таблицу и сравнить, есть ли у кого-то одинаковая строка. Затем измените строку

Нравиться

if list[1].font_name == list[2].font_name then  
  list[2].font_name = list[2].font_name..'2'
end

Может быть более одного совпадения, например

list[1].font_name
list[2].font_name
list[3].font_name

. Спасибо всем, что нашли время ответить на вопрос в сети :) С Рождеством!


person Cacilda    schedule 25.12.2020    source источник
comment
а какой у тебя вопрос? кажется, вы знаете, как проверить, равны ли два значения. и тривиальная задача обхода таблицы объясняется в любом учебнике/книге Lua.   -  person Piglet    schedule 25.12.2020


Ответы (1)


Используйте хеш-таблицу, чтобы подсчитать, сколько раз вы видите каждое имя font_name, и переберите list. Это работает, потому что если два значения сравниваются как равные (без метаметода), они считаются одним и тем же ключом.

-- This keeps track of duplicates.
local counter = {}

for i, v in ipairs(list) do
  local font = v.font_name

  -- Increment the count for this font.
  local count = (counter[font] or 0) + 1
  counter[font] = count

  if count > 1 then
    v.font_name = font .. count
  end
end
person luther    schedule 25.12.2020
comment
Спасибо, Лютер, за ответ, это работает :) Раньше я делал другое решение с двумя циклами for, которые затем сравнивают каждый элемент в таблице и, если он находит дубликат, переименовывает его. Поскольку у вас используется только один цикл for, я думал, что это будет быстрее, но я сравнил его, и на удивление он работал медленнее, чем два цикла for . В любом случае, я буду иметь в виду этот трюк, спасибо !!! :) - person Cacilda; 26.12.2020