Перейти к содержимому
  • 0
Teen_Romance

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

Вопрос

1)У сундука и ME сети из Applied Energistics 2, разные метод и разные структуры возвращаемых таблиц, что касается данных о предмете в слоте. То есть, если я хочу узнать что лежит в 1 слоте в сундуке, я получу таблицу с одной структурой и если я хочу узнать что лежит в первом слоте в me сети, я получу таблицу с другой структурой. Собственно вопрос: есть какие то оптимальные подходы, чтобы сравнить эти две таблицы и понять, одинаковые ли предметы находятся в сундуке и в me сети? Есть конечно старый добрый брутфорс по выбранным захардкоженым полям, но чета это не то. Общая задача: в сундуке в первом слоте лежит пчела, мне нужно найти таких же пчел в me сети и переместить их в сундук. При этим, у пчел есть показатель поколений в неволе, который мне нужно игнорировать.

 

2)Еще побочный вопрос. Может где то можно достать все структуры всех таблиц для разных api из opencomputers? Потому что я могу только сидеть и принтом смотреть какая структура у таблицы, которую возвращает какой то метод, что не очень удобно.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

1) Другого способа сравнения двух таблиц, кроме как поэлементного, не существует. Ты не можешь использовать операторы ">" и "<" для таблиц. Можешь, правда, сравнивать на "равно-не равно", но сравнение всегда вернет falsh, если это разные таблицы, даже если они содержат одинаковые элементы. Другими словами, сравниваются не таблицы, а их адреса. Так что, смирись и брутфорси.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В общем случае Lua не имеет простого и быстрого механизма сравнения двух произвольных таблиц.

 

В промежуточных случаях есть возможность применить некоторые трюки для ускорения операций. Предлагаю понаблюдать за работой этих команд:

component.inventory_controller.store(1,1,component.database.address,1)
component.database.computeHash(1)
component.me_interface.getAvailableItems()[1].fingerprint.nbt_hash
  • Первая команда запоминает в первом слоте апргейда базы данных информацию о предмете, находящемся в первом слоте сундука, стоящего над контролером инвентаря.
  • Вторая команда вычисляет хеш информации о предмете с учётом NBT-тегов.
  • Третья команда также получает хеш, но уже от МЭ-сети и исключительно NBT-тегов. То есть, два разных предмета, но с одинаковыми тегами будут иметь одинаковые хеши.

Этот подход также имеет некоторые сложности:

  • Эти хеши не совпадают, но ассоциативные возможности таблиц Lua позволяют упростить преобразования хэшей.
  • На каждую операцию требуется один тик времени. И если прочитать содержимое МЭ-сети можно за одну операцию, то на обработку каждого слота сундука требуются две операции. Это может представлять проблему для сундуков со свободным доступом для игроков, но информацию о содержимом сундуков с исключительно программным доступом можно кешировать, чтобы избегать повторных вычислений.

В конкретно этом случае также возможны хитрости.

10 часов назад, Teen_Romance сказал:

задача: в сундуке в первом слоте лежит пчела, мне нужно найти таких же пчел в me сети и переместить их в сундук. При этим, у пчел есть показатель поколений в неволе, который мне нужно игнорировать.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...