Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Lua table sorting


Setras

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

Задался я следующей идеей:

В таблицу заносятся данные: 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 уже имеющейся записи?

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

Чем не устраивает функция table.sort ?

Что то типа такого

Quote:
table.sort(Table, function(a, B) return a > b end)

для одномерного массива

или

Quote:
table.sort(Table, function(a, B) return a.NumberValue > b.NumberValue end)

для двумерного

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

ничего не понятно (((

вот у меня таблица с несколькими полями: ПолеА, ПолеБ, ...

мне надо отсортировать по ПолеА+ПолеБ

как код будет выглядеть?

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

Например, так:

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

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

Я давно подозревал...

Не та самая?

Кстати, у нее уже давно выложен аддон на аукцион, но чегой-то я его не вижу на странице с аддонами

SLA, у вас что то сломалось? Она тебе не отписывалась?

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

Похоже, что эта :)

Я тоже заподозрил. А чего они стесняются, не пойму? Девушкам всегда без очереди проверяем и аппрувим аддоны, и отвечаем на все вопросы. :)

Сам аддон нужно немного привести в порядок. Как минимум, добавить поддержку AddonManager, Drag&Drop к кнопке аддона, и скрыть окно при старте. Вчера добрался до QuestTracker, сегодня займусь AucEDSman.

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

написала так:

Code:

function MyCompare( a, b )

    return (a.name .. a.comment) > (b.name .. b.comment)

end

table.sort( t, MyCompare (a,B) )

ошибка:

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)

:(

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

я его чуток переработала - добавила обработку почты и еще... вроде там обновила версию

и вставила функцию что выдает память аддона для аддон манагер

и еще скажу что этот Аддон Манагер по-моему гениально написан! короче я много чего так там и не поняла (((

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

Code:
table.sort( МояТаблица, MyCompare )

и
Code:
table.sort( t, MyCompare (a,B) )

Разницу чуствуешь? :)

ЗЫ. Так же проще:
Code:
table.sort( t, function ( a, b ) return (a.name .. a.comment) > (b.name .. b.comment) end )

не?
Ссылка на комментарий
Поделиться на другие сайты

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

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

не а - дело не в том - она в параметрах 1 и 2 предает значение индекса ! а как значение элемента выцепить?

то есть у меня многомерный массив - ну или набор записей с несколькими полями - как к этим полям обратиться?

Code:

table = { name, comment }

t [1]  = table1

t [2]  = table2

t [1] .name > t [2] .name

...

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

Не понял вопроса. Объясни получше, какая структура у этих таблиц, и по какому значению (в этой структуре) нужно их сортировать. Ну, или, покажи какой-то более конкретный кусок кода (может, там проблема не в этом?).

Теоретически, функция сравнения для table.sort() может сравнивать что угодно, любые значения в любых многомерных массивах.

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

в общем я сделала массив глобальным и просто к нему из подпрограммы по индексам обращаюсь:

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

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

  • 2 года спустя...

Люди еще раз для тех кто в бронепоезде ...

 

  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)

 

 

Что не так?

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

Что не так?

Все так, а что не нравится? Отсортирует записи в таблице по полю NAME в обратном алфавитном порядке.

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

Блин, точно, а не так - не обьявлены a,b как локальные переменные, все понял...

 

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

Важная информация

Пользуясь сайтом, вы принимаете Условия использования