Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

Lua table sorting


Setras
 Share

Recommended Posts

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

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

Link to comment
Share on other sites

Чем не устраивает функция 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)

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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)

:(

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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 )

не?
Link to comment
Share on other sites

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

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

Code:

table = { name, comment }

t [1]  = table1

t [2]  = table2

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

...

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

  • 2 years later...

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

 

  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)

 

 

Что не так?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use