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

  • Автор темы Автор темы Faith
  • Дата начала Дата начала

Faith

Пользователь
8 Сен 2016
18
0
В своем моде использую функцию для сравнения таблиц:
Код:
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. В идеале хотелось бы реализовать такое же сравнение. Стандартная сборка предметов не подходит, это чтобы не предлагали использовать ее.
 
Ты хочешь проверить наличие элемента таблицы т1 в таблице т2?

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

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

Однако, сдается мне что тот же remove реализован через простое сравнивание элемента т1 со всеми элементами таблицы т2 (ну, естественно через встроенный метод get для таблиц с ключами). Поэтому по сути ты все равно выполняешь поэлементное сравнивание.
 
Ну вопрос конечно хрень, ты видимо сравниваешь "массивы", а не таблицы в привычном понимании? Типа таблицы созданные через table.insert? Тогда тебе либо не нужно сравнивать ключ и пройти по значениям одной таблицы и искать эти значения в другой таблице (O(n^2)), либо скопировать и отсортировать обе таблицы через vlua.clone (или copy, не помню) и table.sort и потом проверить твоим же методом.
 
Последнее редактирование модератором:
Реклама: