У меня есть ключ => таблица значений, которую я хотел бы отсортировать в Lua. Ключи являются всеми целыми числами, но не последовательны (и имейте значение). Единственная функция вида Lua, кажется, table.sort
, который рассматривает таблицы как простые массивы, удаляя исходные ключи и их связь с конкретными объектами. Вместо этого я по существу хотел бы смочь использовать PHP's asort()
функция.
Что я имею:
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
Что я хочу после операции вида:
items = {
[1234] = "bar",
[3188] = "baz",
[1004] = "foo",
[7007] = "quux",
}
Какие-либо идеи?
Править: На основе ответов я собираюсь предположить, что это - просто нечетная причуда конкретного встроенного интерпретатора Lua, я работаю с, но во всех моих тестах, pairs()
всегда объекты таблицы возвратов в порядке, в котором они были добавлены к таблице. (т.е. два выше объявлений выполнили бы итерации по-другому).
К сожалению, потому что это не нормальное поведение, похоже, что я не могу получить то, в чем я нуждаюсь; Lua не имеет необходимых инструментов встроенными (конечно), и встроенная среда слишком ограничена, чтобы я работал вокруг этого.
Однако, благодарит за Вашу справку, все!
Вы, кажется, что-то неправильно понимаете. То, что у вас здесь - это ассоциативный массив . Ассоциативные массивы не имеют явного порядка на них, например Это только внутреннее представление (обычно отсортировано), которые их приказывают.
Короче - в Луа, оба размещенных вами массивов то же самое .
То, что вы захотите вместо этого, является такое представление:
items = {
{1004, "foo"},
{1234, "bar"},
{3188, "baz"},
{7007, "quux"},
}
, пока вы не можете получить их по индексу сейчас (они индексируются 1, 2, 3, 4, но вы могут Индексный массив), вы можете отсортировать их с помощью Table.sort
.
Функция сортировки будет тогда:
function compare(a,b)
return a[1] < b[1]
end
table.sort(items, compare)
Хм, пропустил часть о том, что не сможет контролировать итерацию. Там
, но в Луа обычно всегда всегда.
http://luaa-users.org/wiki/orderededAscociativitable
Это начало. Теперь вам нужно было бы заменить пары (), которые использует библиотеку. Это может быть смерными как пары = my_pairs. Затем вы можете использовать решение в ссылке выше
Я сделал короткий бит Lua, кодируя пару лет назад, но я больше не свободно свободно.
Когда столкнулся с подобной проблемой, я скопировал свой массив на другой массив с ключами и значениями изменениями, затем использовал сортировка
на новом массиве.
Я не знал о возможности сортировки массива, используя метод Cornel Kisielewicz.
Массивы PHP отличаются от таблиц LUA.
Массив PHP может иметь заказанный список пар клавишных пар.
Таблица LUA всегда содержит неупорядоченный набор пар клавишных пар.
Таблица LUA действует как массив, когда программист выбирает использовать целые числа 1, 2, 3, ... в качестве клавиш. Языковые синтаксические и стандартные библиотечные функции, такие как Table.sort
, предлагают специальную поддержку таблиц с последовательно-целочисленными ключами.
Итак, если вы хотите эмулировать массив PHP, вам придется представлять его с помощью списка пар клавишных пар, которые действительно являются таблицами таблиц, но это более полезно думать об этом как об этом как список ключей -Палейте пары. Пройдите пользовательскую функцию «менее чем» на таблицу
Table.sort
, и вы все будете настроить.
N.B. Lua позволяет использовать смешивать последовательных целочисленных клавиш с любыми другими видами ключей в таблице в том же таблице , и представление эффективно. Я иногда использую эту функцию, обычно для помещения массива с несколькими кусками метаданных.