2014-03-04 25 views
3

我試圖想到一個簡單的方法,使表中的所有元素都向上移動一個。這是我玩的遊戲,試圖在桌子上的所有目標之間切換!如何移動表中的所有元素?

例如,假設我通過誰想殺我三個四周木克斯,所以我針對所有的人,他們會加入到一個數組,像這樣:

{ 
    "mook1", 
    "mook2", 
    "mook3", 
} 

我想要的是什麼功能做的是改變所有指標要上去一個(或我指定的量),最後去的開始,所以最終的結果將是:

{ 
    "mook3", 
    "mook1", 
    "mook2", 
} 

我試圖對我自己用簡單功能如下:

local function nextIndex(tbl, amount) 
    local t = {} 
    for k,v in ipairs(tbl) do 
    if k < #tbl then 
     t[k+amount] = v 
    else 
     t[1] = v 
    end 
    end 
    return t 
end 

只要金額設置爲1,它就會工作。我確信有一個更聰明,更高效的方法來做到這一點。任何人都可以採取一個重擊嗎?!

+0

'對於i = 1,數量做table.insert(tbl,1,table.remove(tbl))end' –

回答

2

可以使用這樣的函數:

function wrap(t, l) 
    for i = 1, l do 
     table.insert(t, 1, table.remove(t, #t)) 
    end 
end 

你可以看到codepad測試運行。或者,如果您對函數調用的嵌套感到不適,

function wrap(t, l) 
    for i = 1, l do 
     table.insert(t, 1, t[#t]) 
     table.remove(t, #t) 
    end 
end 

would work the same way。

2

我工作多一點,想通了如何做到這一點。這是代碼:

local function nextIndex(tbl, amount) 
    local t = {} 
    local i 
    for k,v in ipairs(tbl) do 
    i = k + amount 
    if i <= #tbl then 
     t[i] = v 
    else 
     t[i-#tbl] = v 
    end 
    end 
    return t 
end 

有沒有更容易的方法來做到這一點呢?

1

所以,任務是將最後一個腐爛物品旋轉到前面。

我添加了參數n以允許覆蓋由#t確定的序列結束。

-- uses t[#t+1]...t[#t+rot%#t] as scratch space 
local function rotate_mod(t, rot, n) 
    n = n or #t 
    rot = rot % n 
    if rot == 0 then return t end 
    for i = n, 1, -1 do 
    t[i + rot] = t[i] 
    end 
    for i = 1, rot do 
    t[i], t[i + n] = t[i + n] 
    end 
    return t 
end 

或者,如果你想要一個新的數組(忽略參數R):

local function rotate_new(t, rot, n, r) 
    n, r = n or #t, {} 
    rot = rot % n 
    for i = 1, rot do 
    r[i] = t[n - rot + i] 
    end 
    for i = rot + 1, n do 
    r[i] = t[i - rot] 
    end 
    return r 
end 
1

這裏是一個真正的 「就地」 版本。它不需要臨時放大表格:

local function reverse(t, i, j) 
    while i < j do 
    t[i], t[j] = t[j], t[i] 
    i, j = i+1, j-1 
    end 
end 

local function rotate_inplace(t, d, n) 
    n = n or #t 
    d = (d or 1) % n 
    reverse(t, 1, n) 
    reverse(t, 1, d) 
    reverse(t, d+1, n) 
end