วิธีจัดเรียงตารางตามค่าแล้วพิมพ์ดัชนีตามลำดับ

ฉันต้องการสร้างตาราง t โดยใช้รูปแบบต่อไปนี้

t[uniqueID] = order

uniqueID จะไม่ซ้ำกัน แต่ order สามารถเหมือนหรือต่างกันในแต่ละครั้ง

จากนั้นฉันต้องการเรียงลำดับตารางจากน้อยไปหามากเพื่อให้สามารถพิมพ์ uniqueID ตามลำดับ

รหัสของฉัน:

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

ผลลัพธ์ที่ฉันได้รับ:

5
6
7

ผลลัพธ์ที่ฉันคาดหวัง:

6
5
7

ฉันจะได้รับผลลัพธ์ที่ต้องการได้อย่างไร?


person Zack Lee    schedule 11.07.2018    source แหล่งที่มา


คำตอบ (2)


จากส่วน “การเขียนโปรแกรมใน Lua” 19.3 “เรียงลำดับ”

ข้อผิดพลาดทั่วไปคือการพยายามเรียงลำดับดัชนีของตาราง ในตาราง ดัชนีจะรวมกันเป็นชุดและไม่มีลำดับใดๆ เลย

นั่นหมายความว่าคุณต้องใส่คู่ของตาราง t ลงในอีกตาราง sorted ซึ่งมีดัชนีที่อยู่ติดกัน ตารางนี้สามารถจัดเรียงตามภาคแสดงที่คุณกำหนดไว้ได้ นอกจากนี้ คุณต้องใช้ ipairs เมื่อวนซ้ำตารางที่จัดทำดัชนีต่อเนื่องกัน เนื่องจากใน pairs ลำดับไม่ได้ระบุ

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

ถ่ายทอดสดบน Wandbox

person Henri Menke    schedule 11.07.2018

pairs ไม่ทำซ้ำในลำดับใดๆ โดยเฉพาะ (ไม่ว่าหรือ ไม่ได้เรียงลำดับ)

table.sort ใช้ได้กับ รายการ เท่านั้น -- ตารางที่ใช้คีย์ [1], [2], [3], ..., [#list]


คุณต้องการรายการ ID ตามลำดับ นี่หมายความว่า

  1. ทำรายการรหัส
  2. จัดเรียงตามค่าที่เกี่ยวข้อง

ในรหัส

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