ตารางในรูปแบบอาร์เรย์
สร้างและจัดการอาร์เรย์ที่เริ่มนับดัชนีจาก 1 ด้วย table.insert และ table.remove
ตารางในรูปแบบอาร์เรย์ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
อาร์เรย์ที่เริ่มดัชนีจาก 1
อาร์เรย์ของ Lua คือตารางที่มีคีย์จำนวนเต็มต่อเนื่อง โดยเริ่มจาก 1 ซึ่งต่างจากภาษาส่วนใหญ่ที่เริ่มจาก 0 ธรรมเนียมนี้ใช้ทั่วทั้ง Lua — ฟังก์ชันในไลบรารีมาตรฐานทั้งหมดถือว่าดัชนีเริ่มจาก 1 การเข้าถึงนอกขอบเขตจะคืนค่า nil ไม่ใช่ข้อผิดพลาด
local colors = {"red", "green", "blue"}
print(colors[1]) -- red
print(colors[2]) -- green
print(colors[3]) -- blue
print(colors[0]) -- nil (no index 0)
print(#colors) -- 3 (length operator)table.insert และ table.remove
table.insert(t, val) เพิ่มค่าต่อท้าย table.insert(t, pos, val) แทรกค่าที่ตำแหน่งหนึ่งและเลื่อนสมาชิกไปทางขวา table.remove(t, pos) ลบสมาชิกที่ pos (ค่าเริ่มต้นคือสมาชิกสุดท้าย) เลื่อนสมาชิกไปทางซ้าย และคืนค่าที่ลบออก
local stack = {}
table.insert(stack, "first")
table.insert(stack, "second")
table.insert(stack, "third")
print(#stack) -- 3
table.insert(stack, 2, "inserted")
print(stack[2]) -- inserted
local removed = table.remove(stack, 1)
print(removed) -- first
print(stack[1]) -- insertedสแตกด้วยตาราง
ตาราง Lua สามารถทำหน้าที่เป็นสแตกได้อย่างสมบูรณ์ ใช้ table.insert เพื่อดันค่าเข้า และใช้ table.remove เพื่อดึงค่าออก โดยค่าเริ่มต้นทั้งสองการทำงานจะทำที่ส่วนท้ายของตาราง จึงมีเวลาแบบ O(1) โดยเฉลี่ยสะสม
local stack = {}
-- Push
table.insert(stack, 10)
table.insert(stack, 20)
table.insert(stack, 30)
-- Pop
print(table.remove(stack)) -- 30
print(table.remove(stack)) -- 20
print(#stack) -- 1คิวด้วยตาราง
สามารถสร้างคิว (FIFO) ด้วยตารางได้ แต่ table.remove(t, 1) มีเวลา O(n) เพราะต้องเลื่อนสมาชิกทั้งหมด สำหรับคิวประสิทธิภาพสูง ให้ใช้ตัวชี้สองตัว (ดัชนีส่วนหัวและส่วนท้าย) เพื่อหลีกเลี่ยงการเลื่อน
local head, tail = 1, 0
local queue = {}
local function enqueue(v)
tail = tail + 1
queue[tail] = v
end
local function dequeue()
if head > tail then return nil end
local v = queue[head]
queue[head] = nil
head = head + 1
return v
end
enqueue("a"); enqueue("b"); enqueue("c")
print(dequeue()) -- a
print(dequeue()) -- bตัวดำเนินการความยาว #
ตัวดำเนินการ # คืนค่า "ขอบเขต" ของตาราง ซึ่งเป็นดัชนี i ที่ทำให้ t[i] ~= nil และ t[i+1] == nil สำหรับลำดับที่ไม่มีช่องว่าง ค่านี้จะเท่ากับความยาวของอาร์เรย์ หากมีช่องว่าง (มี nil อยู่ตรงกลาง) ผลลัพธ์ของ # จะไม่กำหนดแน่นอน — ให้ใช้ table.pack หรือติดตามความยาวด้วยตนเอง
local t = {10, 20, 30, 40, 50}
print(#t) -- 5
-- Safe for dense arrays
for i = #t, 1, -1 do
io.write(t[i] .. " ")
end
print() -- 50 40 30 20 10การตัดแบ่งอาร์เรย์
Lua ไม่มีการตัดแบ่งในตัว แต่คุณสามารถดึงอาร์เรย์ย่อยด้วย table.move (Lua 5.3 ขึ้นไป) หรือใช้ลูปเขียนเอง table.move(a1, f, e, t, a2) คัดลอกสมาชิกจาก a1[f..e] ไปยัง a2 โดยเริ่มที่ตำแหน่ง t
local src = {10,20,30,40,50,60}
-- Manual slice
local function slice(t, from, to)
local result = {}
for i = from, to do
result[#result+1] = t[i]
end
return result
end
local sub = slice(src, 2, 4)
print(sub[1], sub[2], sub[3]) -- 20 30 40กลับลำดับอาร์เรย์
กลับลำดับตารางภายในตารางเดิมโดยสลับสมาชิกจากปลายทั้งสองเข้าหาตรงกลาง นี่เป็นอัลกอริทึมคลาสสิกที่ใช้ได้กับอาร์เรย์ Lua ทุกชนิดโดยไม่ต้องใช้หน่วยความจำเพิ่มเติม
local function reverse(t)
local n = #t
for i = 1, math.floor(n / 2) do
t[i], t[n - i + 1] = t[n - i + 1], t[i]
end
end
local arr = {1, 2, 3, 4, 5}
reverse(arr)
for _, v in ipairs(arr) do
io.write(v .. " ")
end
print() -- 5 4 3 2 1การต่ออาร์เรย์
หากต้องการรวมอาร์เรย์สองชุดเป็นชุดเดียว ให้วนซ้ำผ่านอาร์เรย์ที่สองแล้วเพิ่มสมาชิกต่อท้าย table.move ทำงานนี้ได้อย่างมีประสิทธิภาพใน Lua 5.3 ขึ้นไป ผลลัพธ์คือตารางใหม่ที่มีสมาชิกทั้งหมดจากอาร์เรย์ทั้งสองตามลำดับ
local function concat(a, b)
local result = {}
for _, v in ipairs(a) do result[#result+1] = v end
for _, v in ipairs(b) do result[#result+1] = v end
return result
end
local merged = concat({1,2,3}, {4,5,6})
for i, v in ipairs(merged) do
io.write(v .. " ")
end
print() -- 1 2 3 4 5 6การทำอาร์เรย์ซ้อนให้แบนราบ
ทำอาร์เรย์ซ้อนให้แบนราบแบบเรียกซ้ำ: หากสมาชิกเป็นตาราง ให้เรียกใช้ฟังก์ชันกับตารางนั้นต่อไป มิฉะนั้นให้เพิ่มสมาชิกนั้นลงในผลลัพธ์ วิธีนี้เป็นการประยุกต์ใช้การท่องผ่านตารางแบบเรียกซ้ำโดยตรง
local function flatten(t, result)
result = result or {}
for _, v in ipairs(t) do
if type(v) == "table" then
flatten(v, result)
else
result[#result+1] = v
end
end
return result
end
local nested = {1, {2, 3}, {4, {5, 6}}, 7}
local flat = flatten(nested)
print(table.concat(flat, ", ")) -- 1, 2, 3, 4, 5, 6, 7อาร์เรย์ในรูปแบบเซต
คุณสามารถสร้างเซตโดยใช้ตารางที่มีค่าเป็นคีย์ และกำหนดค่าเป็น true การตรวจสอบการมีสมาชิกในเซตใช้เวลา O(1) การสร้างเซตจากอาร์เรย์จะกำจัดค่าที่ซ้ำกัน หากต้องการแปลงกลับเป็นอาร์เรย์ ให้ท่องผ่านตารางด้วย pairs
local function toSet(arr)
local set = {}
for _, v in ipairs(arr) do set[v] = true end
return set
end
local nums = {3,1,4,1,5,9,2,6,5,3}
local set = toSet(nums)
local unique = {}
for k in pairs(set) do unique[#unique+1] = k end
table.sort(unique)
print(table.concat(unique, " ")) -- 1 2 3 4 5 6 9ตรวจสอบอย่างรวดเร็ว
table.remove(t) ทำอะไรเมื่อเรียกใช้โดยส่งอาร์กิวเมนต์เพียงตัวเดียว
ทบทวน: ตารางในรูปแบบอาร์เรย์
สรุป:
- อาร์เรย์ของ lua คือตารางที่เริ่มดัชนีจาก 1
- ใช้
table.insert/table.removeสำหรับการเพิ่ม/นำสมาชิกออกจากส่วนท้าย #tให้ความยาวของลำดับที่ไม่มีช่องว่าง- สแตก: เพิ่ม/นำสมาชิกออกจากส่วนท้าย (O(1))
- คิว: ใช้ตัวชี้ส่วนหัวและส่วนท้ายเพื่อหลีกเลี่ยงการเลื่อนที่ใช้เวลา O(n)
- ใช้ตารางในรูปแบบเซตสำหรับการตรวจสอบสมาชิกที่ใช้เวลา O(1)
เรียนรู้ Lua ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 40
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “ตารางในรูปแบบอาร์เรย์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตารางในรูปแบบอาร์เรย์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตารางในรูปแบบอาร์เรย์”
สร้างและจัดการอาร์เรย์ที่เริ่มนับดัชนีจาก 1 ด้วย table.insert และ table.remove คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ตารางในรูปแบบอาร์เรย์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตารางในรูปแบบอาร์เรย์
- ตารางในรูปแบบพจนานุกรม
- การวนดูตารางด้วย pairs และ ipairs
- ตารางซ้อนกันและข้อมูลแบบมีโครงสร้าง