Lua Academy · บทเรียน

ตารางในรูปแบบอาร์เรย์

สร้างและจัดการอาร์เรย์ที่เริ่มนับดัชนีจาก 1 ด้วย table.insert และ table.remove

บทเรียน 1 จาก 412 ขั้นตอน

ตารางในรูปแบบอาร์เรย์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตารางในรูปแบบอาร์เรย์
  2. ตารางในรูปแบบพจนานุกรม
  3. การวนดูตารางด้วย pairs และ ipairs
  4. ตารางซ้อนกันและข้อมูลแบบมีโครงสร้าง
← กลับไปที่ Lua Academy