Setras Posted December 13, 2010 Share Posted December 13, 2010 Задался я следующей идеей: В таблицу заносятся данные: Table[objectid] = number Успешно работает функция for k, v in Table do v = SomeFunction(k) end И т.д., но вот мне понадобилось вывести ключи/значения (например for k, v in Table do LogInfo("Key: ",k," and value: ",v) end) но чтобы сперва выводились те, у которых v больше, потом по убыванию... Как проще всего это реализовать? Использовать table.insert и вставлять .ObjectId и .NumberValue ?? Как тогда проверять не содержит ли таблица уже такой ObjectId и надо ли создать новую запись в ней или надо изменить NumberValue уже имеющейся записи? Quote Link to comment Share on other sites More sharing options...
Nikon Posted December 13, 2010 Share Posted December 13, 2010 Чем не устраивает функция table.sort ? Что то типа такого Quote: table.sort(Table, function(a, return a > b end) для одномерного массива или Quote: table.sort(Table, function(a, return a.NumberValue > b.NumberValue end) для двумерного Quote Link to comment Share on other sites More sharing options...
icreator Posted December 20, 2010 Share Posted December 20, 2010 ничего не понятно ((( вот у меня таблица с несколькими полями: ПолеА, ПолеБ, ... мне надо отсортировать по ПолеА+ПолеБ как код будет выглядеть? Quote Link to comment Share on other sites More sharing options...
SLA Posted December 20, 2010 Share Posted December 20, 2010 Например, так: Code: table.sort( МояТаблица, function( a, b ) return a.ПолеА + a.ПолеБ > b.ПолеА + b.ПолеБ end ) или, вот, более развёрнутый вариант: Code: function MyCompare( a, b ) return a.ПолеА + a.ПолеБ > b.ПолеА + b.ПолеБ end Code: table.sort( МояТаблица, MyCompare ) Во втором варианте, MyCompare() - это отдельно объявленная функция. В обоих вариантах, table.sort() будет пользоваться указанной функцией, чтобы сравнивать между собой разные элементы таблицы, и таким образом, отсортировать всю таблицу. Предназначение этой функции такое: Она получает два элемента таблицы, и она должна их как-то по-своему сравнить, и ответить, либо true, либо false. Ответ true означает, что ПЕРВЫЙ элемент нужно поместить в таблице выше второго. Ответ false означает, что ВТОРОЙ элемент нужно поместить в таблице выше первого. Если ещё не понятно, то вот более развёрнутый вариант той же функции: Code: function MyCompare( a, b ) if a.ПолеА + a.ПолеБ > b.ПолеА + b.ПолеБ then return true -- Ответ: a выше чем b. else return false -- Ответ: b выше чем a. end end Quote Link to comment Share on other sites More sharing options...
icreator Posted December 20, 2010 Share Posted December 20, 2010 спасибки за обстоятельный ответ!!! теперь поняла Quote Link to comment Share on other sites More sharing options...
SLA Posted December 21, 2010 Share Posted December 21, 2010 Комрады! Среди нас девушка! Quote Link to comment Share on other sites More sharing options...
Nikon Posted December 21, 2010 Share Posted December 21, 2010 Я давно подозревал... Не та самая? Кстати, у нее уже давно выложен аддон на аукцион, но чегой-то я его не вижу на странице с аддонами SLA, у вас что то сломалось? Она тебе не отписывалась? Quote Link to comment Share on other sites More sharing options...
SLA Posted December 21, 2010 Share Posted December 21, 2010 Похоже, что эта Я тоже заподозрил. А чего они стесняются, не пойму? Девушкам всегда без очереди проверяем и аппрувим аддоны, и отвечаем на все вопросы. Сам аддон нужно немного привести в порядок. Как минимум, добавить поддержку AddonManager, Drag&Drop к кнопке аддона, и скрыть окно при старте. Вчера добрался до QuestTracker, сегодня займусь AucEDSman. Quote Link to comment Share on other sites More sharing options...
icreator Posted December 21, 2010 Share Posted December 21, 2010 написала так: Code: function MyCompare( a, b ) return (a.name .. a.comment) > (b.name .. b.comment) end table.sort( t, MyCompare (a, ) ошибка: Error: addon AucEDSman: func: Repaint, method, line: 207, defined: Lua, line: 199, [string "mods/addons/aucedsman/scriptlist.lua"] Error: addon AucEDSman: Attempt to read from undeclared global variable: a Error: addon AucEDSman: func: Repaint, method, line: 207, defined: Lua, line: 199, [string "mods/addons/aucedsman/scriptlist.lua"] Error: addon AucEDSman: Attempt to read from undeclared global variable: b [string "mods/addons/aucedsman/scriptlist.lua"]:196: attempt to index local `a' (a nil value) Quote Link to comment Share on other sites More sharing options...
icreator Posted December 21, 2010 Share Posted December 21, 2010 я его чуток переработала - добавила обработку почты и еще... вроде там обновила версию и вставила функцию что выдает память аддона для аддон манагер и еще скажу что этот Аддон Манагер по-моему гениально написан! короче я много чего так там и не поняла ((( Quote Link to comment Share on other sites More sharing options...
Nikon Posted December 21, 2010 Share Posted December 21, 2010 Code: table.sort( МояТаблица, MyCompare ) иCode: table.sort( t, MyCompare (a, ) Разницу чуствуешь? ЗЫ. Так же проще:Code: table.sort( t, function ( a, b ) return (a.name .. a.comment) > (b.name .. b.comment) end ) не? Quote Link to comment Share on other sites More sharing options...
SLA Posted December 21, 2010 Share Posted December 21, 2010 Просто, эти "(a," убери из table.sort(). Вот так: Code: table.sort( t, MyCompare ) Quote Link to comment Share on other sites More sharing options...
SLA Posted December 21, 2010 Share Posted December 21, 2010 Не скачивается оттуда. Выложи его аттачментом здесь, посмотрю, в чём может быть проблема. Quote Link to comment Share on other sites More sharing options...
SLA Posted December 21, 2010 Share Posted December 21, 2010 Code: table.sort( t, MyCompare ) Quote Link to comment Share on other sites More sharing options...
icreator Posted December 26, 2010 Share Posted December 26, 2010 не а - дело не в том - она в параметрах 1 и 2 предает значение индекса ! а как значение элемента выцепить? то есть у меня многомерный массив - ну или набор записей с несколькими полями - как к этим полям обратиться? Code: table = { name, comment } t [1] = table1 t [2] = table2 t [1] .name > t [2] .name ... Quote Link to comment Share on other sites More sharing options...
SLA Posted December 26, 2010 Share Posted December 26, 2010 Не понял вопроса. Объясни получше, какая структура у этих таблиц, и по какому значению (в этой структуре) нужно их сортировать. Ну, или, покажи какой-то более конкретный кусок кода (может, там проблема не в этом?). Теоретически, функция сравнения для table.sort() может сравнивать что угодно, любые значения в любых многомерных массивах. Quote Link to comment Share on other sites More sharing options...
icreator Posted December 29, 2010 Share Posted December 29, 2010 в общем я сделала массив глобальным и просто к нему из подпрограммы по индексам обращаюсь: Code: MyCompare = function (IndexA, IndexB ) local tA = addon.widgets.elems [IndexA] local tB = addon.widgets.elems [IndexB] return ( FromWS(tA.name) .. FromWS(tA.comment) ) < (FromWS(tB.name) .. FromWS(tB.comment) ) end Quote Link to comment Share on other sites More sharing options...
jedbez Posted August 20, 2013 Share Posted August 20, 2013 Люди еще раз для тех кто в бронепоезде ... local aa={} aa[1]={NAME="cds",DKP=321} aa[2]={NAME="zxd",DKP=432} aa[3]={NAME="abc",DKP=123} table.sort(aa, function(a,b ) return a.NAME>b.NAME end) Что не так? Quote Link to comment Share on other sites More sharing options...
Mankubus Posted August 20, 2013 Share Posted August 20, 2013 Что не так? Все так, а что не нравится? Отсортирует записи в таблице по полю NAME в обратном алфавитном порядке. Quote Link to comment Share on other sites More sharing options...
jedbez Posted August 20, 2013 Share Posted August 20, 2013 Блин, точно, а не так - не обьявлены a,b как локальные переменные, все понял... Quote Link to comment Share on other sites More sharing options...
Recommended Posts