الجداول بوصفها مصفوفات
أنشئ مصفوفات تبدأ فهارسها من 1 وعالجها باستخدام table.insert وtable.remove
الجداول بوصفها مصفوفات درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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)
الأسئلة الشائعة
هل درس «الجداول بوصفها مصفوفات» مجاني؟
نعم — نص درس «الجداول بوصفها مصفوفات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «الجداول بوصفها مصفوفات»؟
أنشئ مصفوفات تبدأ فهارسها من 1 وعالجها باستخدام table.insert وtable.remove تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الجداول بوصفها مصفوفات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الجداول بوصفها مصفوفات
- الجداول بوصفها قواميس
- التكرار عبر الجداول باستخدام pairs وipairs
- الجداول المتداخلة والبيانات المهيكلة