Cara mengurutkan tabel berdasarkan nilai lalu mencetak indeks secara berurutan

Saya ingin membuat tabel t menggunakan format berikut.

t[uniqueID] = order

uniqueID akan unik tetapi order bisa sama atau berbeda setiap saat.

Dan kemudian saya ingin mengurutkan tabel dalam urutan menaik sehingga saya dapat mencetak uniqueID yang sesuai.

Kode Saya:

t = {}

function compare(a, b)
    return a[2] < b[2]
end

function printid()
    for k, v in pairs(t) do
        print(k)
    end
end

function main()
    t[5] = 47
    t[6] = 45
    t[7] = 49
    table.sort(t, compare)
    printid()
end

Hasil yang saya dapatkan:

5
6
7

Hasil yang saya harapkan:

6
5
7

Bagaimana saya bisa mendapatkan hasil yang saya inginkan?


person Zack Lee    schedule 11.07.2018    source sumber


Jawaban (2)


Dari bagian “Pemrograman dalam Lua” 19.3 “Sort”.

Kesalahan umum adalah mencoba mengurutkan indeks tabel. Dalam sebuah tabel, indeks-indeksnya membentuk satu himpunan, dan tidak memiliki urutan apa pun.

Artinya, Anda harus meletakkan pasangan tabel t ke tabel lain sorted yang kemudian memiliki indeks yang berdekatan. Tabel ini kemudian dapat diurutkan berdasarkan predikat yang Anda tentukan. Selain itu, Anda harus menggunakan ipairs saat mengulangi tabel yang diindeks secara berdekatan karena di pairs urutannya tidak ditentukan.

local t = {}

t[5] = 47
t[6] = 45
t[7] = 49

local sorted = {}
for k, v in pairs(t) do
    table.insert(sorted,{k,v})
end

table.sort(sorted, function(a,b) return a[2] < b[2] end)

for _, v in ipairs(sorted) do
    print(v[1],v[2])
end

Langsung di Wandbox

person Henri Menke    schedule 11.07.2018

pairs tidak melakukan iterasi dalam urutan tertentu (terlepas dari apakah atau tidak diurutkan).

table.sort hanya berfungsi pada daftar -- tabel yang menggunakan kunci [1], [2], [3], ..., [#list].


Anda ingin daftar ID dalam urutan yang diurutkan. Ini berarti

  1. membuat daftar ID
  2. urutkan berdasarkan nilai terkaitnya

Dalam kode,

local ids = {}

-- Order of insertion doesn't matter here since we will sort
for id in pairs(t) do
    table.insert(ids, id)
end

-- Sort the list of IDs by the values associated with each
table.sort(ids, function(a, b)
    return t[a] < t[b]
end)

for i = 1, #ids do
    print(ids[i])
end
--> 6
--> 5
--> 7
person Curtis Fenner    schedule 11.07.2018