CustomGames.ru - Dota 2 пользовательские игры

Сравнение таблиц

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Faith

  • 18
  • Мощь: 0
Сравнение таблиц
« : 07-11-2016, 03:48:27 »
В своем моде использую функцию для сравнения таблиц:
Спойлер
Код
function MatchTables(table1, table2)
for k, v in pairs(table1) do
if table2[k] ~= v then return false end
end
for k, v in pairs(table2) do
if table1[k] ~= v then return false end
end
return true
end
[свернуть]
Дело в том что при таком сравнении не учитывается расположение элементов. То есть имея таблицу с элементами X Y Z она не будет равна таблице Z X Y. Как подправить?
Есть идея сравнивать каждый элемент с каждым элементом таблицы, но мне кажется есть вариант по-проще, поэтому спрашиваю здесь о наличии такого.

Что бы было более понятней, использую для сравнения предметов в инвентаре, с элементами(предметами) в таблице таблиц, и если есть соответствие, даю другой предмет. Типо стандартной сборки предметов Dota2. В идеале хотелось бы реализовать такое же сравнение. Стандартная сборка предметов не подходит, это чтобы не предлагали использовать ее.
« Последнее редактирование: 07-11-2016, 04:00:54 от Faith »

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Re: Сравнение таблиц
« Ответ #1 : 07-11-2016, 11:09:56 »
Ты хочешь проверить наличие элемента таблицы т1 в таблице т2?

Вот все методы по работе с таблицами в луа.

Можешь через remove удалять из т2 элемент таблицы т1, а затем проверять размер таблицы т2. Если он изменился, значит в т2 был элемент из т1. Потом назад его добавлять. Если нет, то не было. (Но сначала проверь, что будет, если попробуешь удалить несуществующий элемент, т.к. я такого в луа не пробовал.)

Однако, сдается мне что тот же remove реализован через простое сравнивание элемента т1 со всеми элементами таблицы т2 (ну, естественно через встроенный метод get для таблиц с ключами). Поэтому по сути ты все равно выполняешь поэлементное сравнивание.

Оффлайн MahouShoujo

  • 171
  • Мощь: 3
Re: Сравнение таблиц
« Ответ #2 : 07-11-2016, 12:11:33 »
Ну вопрос конечно хрень, ты видимо сравниваешь "массивы", а не таблицы в привычном понимании? Типа таблицы созданные через table.insert? Тогда тебе либо не нужно сравнивать ключ и пройти по значениям одной таблицы и искать эти значения в другой таблице (O(n^2)), либо скопировать и отсортировать обе таблицы через vlua.clone (или copy, не помню) и table.sort и потом проверить твоим же методом.