Lua Academy · Ders

Diziler Olarak Tablolar

table.insert ve table.remove ile 1 tabanlı diziler oluşturun ve işleyin.

1. ders / 412 adım

Diziler Olarak Tablolar, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

1 Tabanlı Diziler

Lua dizileri, 1'den başlayan ardışık tam sayı anahtarlarına sahip tablolardır. Bu, 0'dan başlayan çoğu dilden farklıdır. Lua'da bu kural evrenseldir — standart kitaplıktaki tüm fonksiyonlar 1 tabanlı indislemeyi varsayar. Sınır dışı erişim hata yerine nil döndürür.

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 ve table.remove

table.insert(t, val) sona ekler. table.insert(t, pos, val) bir konuma ekleme yapar ve öğeleri sağa kaydırır. table.remove(t, pos), pos konumundaki öğeyi (varsayılan: son öğe) kaldırır, öğeleri sola kaydırır ve kaldırılan değeri döndürür.

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

Tablolarla Yığın

Lua tablosu kusursuz bir yığın oluşturur. Yığına eklemek için table.insert, yığından çıkarmak için table.remove kullanın. Her iki işlem de varsayılan olarak tablonun sonundan çalışır ve itfa edilmiş O(1) zaman sağlar.

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

Tablolarla Kuyruk

Bir kuyruk (FIFO) tabloyla uygulanabilir; ancak table.remove(t, 1), tüm öğeleri kaydırdığı için O(n) maliyetlidir. Yüksek performanslı kuyruklar için kaydırmayı önlemek üzere iki işaretçi (baş ve kuyruk indisleri) kullanı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

# Uzunluk Operatörü

# operatörü, bir tablonun "sınırını" döndürür: t[i] ~= nil ve t[i+1] == nil koşullarını sağlayan bir i indisi. Boşluk içermeyen dizilerde bu değer dizi uzunluğuna eşittir. Ortasında boşluklar (nil değerleri) bulunan dizilerde # tanımsız sonuçlar verir — bunun yerine table.pack kullanın veya uzunluğu elle izleyin.

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

Dizileri Dilimleme

Lua'da yerleşik dilimleme işlemi yoktur; ancak table.move (Lua 5.3+) veya elle yazılmış bir döngüyle bir alt dizi çıkarabilirsiniz. table.move(a1, f, e, t, a2), a1[f..e] aralığındaki öğeleri t konumundan başlayarak a2 tablosuna kopyalar.

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

Diziyi Ters Çevirme

Her iki uçtaki öğeleri ortaya doğru birbirleriyle değiştirerek bir tabloyu yerinde tersine çevirin. Bu, ek bellek kullanmadan herhangi bir Lua dizisi üzerinde çalışan klasik bir algoritmadır.

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

Dizileri Birleştirme

İki diziyi tek bir dizide birleştirmek için ikinci dizi üzerinde döngü kurup öğelerini sona ekleyin. table.move, bunu Lua 5.3 ve sonraki sürümlerde verimli biçimde yapar. Sonuç, her iki dizinin tüm öğelerini sıralarını koruyarak içeren yeni bir tablodur.

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

İç İçe Dizileri Düzleştirme

İç içe bir diziyi özyinelemeli olarak düzleştirin: Bir öğe tabloysa onun üzerinde özyinelemeli olarak çalışın; değilse öğeyi sonuca ekleyin. Bu, özyinelemeli tablo dolaşımının doğal bir uygulamasıdır.

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

Küme Olarak Dizi

Değerlerin anahtar, karşılık gelen değerin ise true olduğu bir tablo kullanarak küme uygulayabilirsiniz. Küme üyeliği denetimi O(1) sürede yapılır. Bir diziden küme oluşturmak, yinelenen öğeleri kaldırır. pairs ile dolaşarak yeniden diziye dönüştürebilirsiniz.

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

Hızlı Kontrol

Yalnızca bir bağımsız değişkenle çağrıldığında table.remove(t) ne yapar?

Özet: Dizi Olarak Tablolar

Özet:

  • Lua dizileri 1'den başlayan tablolardır
  • Yığına ekleme ve yığından çıkarma için table.insert/table.remove
  • #t, boşluk içermeyen dizilerin uzunluğunu verir
  • Yığın: sondan ekleme/çıkarma (O(1))
  • Kuyruk: O(n) kaydırmadan kaçınmak için baş+son işaretçilerini kullanın
  • O(1) üyelik denetimleri için tabloyu küme olarak kullanın
Başlamak ücretsiz

Yapay zeka eğitmeniyle Lua öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
40
Dersler
159

Sıkça Sorulan Sorular

“Diziler Olarak Tablolar” dersi ücretsiz mi?

Evet — “Diziler Olarak Tablolar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“Diziler Olarak Tablolar” dersinde ne öğreneceğim?

table.insert ve table.remove ile 1 tabanlı diziler oluşturun ve işleyin. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Diziler Olarak Tablolar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Diziler Olarak Tablolar
  2. Sözlükler Olarak Tablolar
  3. Tabloları pairs ve ipairs ile Yineleme
  4. İç İçe Tablolar ve Yapılandırılmış Veriler
← Lua Academy Sayfasına Dön