Lua — Помогает сортировать массив таблиц в алфавитном порядке по значению внутри себя

#arrays #sorting #lua #fivem

#массивы #сортировка #lua #пять

Вопрос:

Я довольно новичок в кодировании lua, делал это для сценариев GTAV FiveM, я также новичок здесь, чтобы извиниться, если я сделаю или скажу что-то не так.

Я пытался создать скрипт, который обрабатывает имена колес, их идентификатор и независимо от того, установлены ли они уже на транспортном средстве.

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

Это фрагмент кода, который я использую для создания таблицы для ясности:

 for i = 1, (GetNumVehicleMods(vehicle, 23)  1) do   local modName = GetLabelText(GetModTextLabel(vehicle, 23, (i-1)))   txt = ""  if GetVehicleMod(vehicle, 23) == (i-1) and tonumber(originalWheel) == tonumber(wheeltype) then   txt = "Currently Installed"  end  validMods[i] =  {  id = (i-1),  name = modName,  install = txt  } end  

Этот…из того, что я считаю, это составление списка колес по их идентификатору , например:

 validMods = {  [1] = { id = 0, name = "Inferno", install = "Currently Installed" },  [2] = { id = 1, name = "Deep Five", install = "" },  [3] = { id = 2, name = "Inferno", install = "" },  [4] = { id = 3, name = "Deep Five", install = "" } }  

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

 validMods = {  [1] = { id = 0, name = "Inferno", install = "Currently Installed" },  [2] = { id = 2, name = "Inferno", install = "" },  [3] = { id = 1, name = "Deep Five", install = "" },  [4] = { id = 3, name = "Deep Five", install = "" } }  

Кроме того, если это possible…is можно добавить дополнительный текст в конце повторяющихся имен..например: Inferno, Inferno var2, Inferno Var3


Спасибо за любую помощь, которую можно оказать

Ответ №1:

Поскольку вы получаете эти имена в определенном порядке, вам необходимо отсортировать их после заполнения таблицы.

Чтобы переименовать дубликаты, подсчитайте, как часто вы встречали имя.

 -- demo input local validMods = {  [1] = { id = 0, name = "Inferno", install = "Currently Installed" },  [2] = { id = 1, name = "Deep Five", install = "" },  [3] = { id = 2, name = "Inferno", install = "" },  [4] = { id = 3, name = "Deep Five", install = "" } } -- count and rename local names = {} for i,v in ipairs(validMods) do  if names[v.name] then  names[v.name] = names[v.name]   1  v.name = v.name .. " var" .. names[v.name]  else  names[v.name] = 1  end end -- sort the table by name ascending table.sort(validMods, function(a,b) return a.name lt; b.name end)  -- print sorted names for i,v in ipairs(validMods) do print(v.name) end  

Комментарии:

1. О боже, спасибо тебе, это именно то, что мне было нужно! Ты сделала мой день особенным, лол

2. просто убедитесь, что вы понимаете, что здесь происходит