Ассоциативно сортируя таблицу по значению в Lua

У меня есть ключ => таблица значений, которую я хотел бы отсортировать в 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 не имеет необходимых инструментов встроенными (конечно), и встроенная среда слишком ограничена, чтобы я работал вокруг этого.

Однако, благодарит за Вашу справку, все!

20
задан hjpotter92 19 August 2013 в 13:28
поделиться

4 ответа

Вы, кажется, что-то неправильно понимаете. То, что у вас здесь - это ассоциативный массив . Ассоциативные массивы не имеют явного порядка на них, например Это только внутреннее представление (обычно отсортировано), которые их приказывают.

Короче - в Луа, оба размещенных вами массивов то же самое .

То, что вы захотите вместо этого, является такое представление:

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)
37
ответ дан 29 November 2019 в 22:58
поделиться

Хм, пропустил часть о том, что не сможет контролировать итерацию. Там

, но в Луа обычно всегда всегда.

http://luaa-users.org/wiki/orderededAscociativitable

Это начало. Теперь вам нужно было бы заменить пары (), которые использует библиотеку. Это может быть смерными как пары = my_pairs. Затем вы можете использовать решение в ссылке выше

6
ответ дан 29 November 2019 в 22:58
поделиться

Я сделал короткий бит Lua, кодируя пару лет назад, но я больше не свободно свободно.

Когда столкнулся с подобной проблемой, я скопировал свой массив на другой массив с ключами и значениями изменениями, затем использовал сортировка на новом массиве.

Я не знал о возможности сортировки массива, используя метод Cornel Kisielewicz.

1
ответ дан 29 November 2019 в 22:58
поделиться

Массивы PHP отличаются от таблиц LUA.

  • Массив PHP может иметь заказанный список пар клавишных пар.

  • Таблица LUA всегда содержит неупорядоченный набор пар клавишных пар.

Таблица LUA действует как массив, когда программист выбирает использовать целые числа 1, 2, 3, ... в качестве клавиш. Языковые синтаксические и стандартные библиотечные функции, такие как Table.sort , предлагают специальную поддержку таблиц с последовательно-целочисленными ключами.

Итак, если вы хотите эмулировать массив PHP, вам придется представлять его с помощью списка пар клавишных пар, которые действительно являются таблицами таблиц, но это более полезно думать об этом как об этом как список ключей -Палейте пары. Пройдите пользовательскую функцию «менее чем» на таблицу Table.sort , и вы все будете настроить.

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

3
ответ дан 29 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: