Lua在2d数组中左右移动元素

时间:2014-03-27 17:47:33

标签: arrays lua shift lua-table

我有一个二维数组:grid[x][y]

1     2     3     4     5     6     7     8
11    12    13    14    15    16    17    18
21    22    23    24    25    26    27    28
31    32    33    34    35    36    37    38
41    42    43    44    45    46    47    48

实施例: 我想将第3列向下移动,底部元素进入第一行,如下所示:

41    2     3     4     5     6     7     8
 1    12    13    14    15    16    17    18
11    22    23    24    25    26    27    28
21    32    33    34    35    36    37    38
31    42    43    44    45    46    47    48

我使用以下函数左右移动整个数组,但在2d数组中,这显然不起作用,因为如果移动它,你必须将元素移动到另一个数组:

function wrap( t, l )
    -- change i=0 to move left and i=1 to right
    for i = 1, l do
        table.insert( t, 1, table.remove( t, #t ) )
    end
end

我在Lua暂存器中尝试过这个功能但是它没有工作......我无法在不丢失元素的情况下找出逻辑。

function shift( t, direction )

for i=1,#t do
    if(direction == "left") then
            if(i == 1) then
                tempElement = t[#t][6] 
            else
                tempElement = t[i-1][6]
            end
    else
            if(i == 7) then
                tempElement = t[1][6] 
            else
                tempElement = t[i+1][6]
            end
    end    

table.insert( t[i], 6, tempElement )
table.remove( t[i], 12)

end

end

如何将元素转移到另一列但相同的索引,因此grid[5][1]进入grid[4][1],依此类推。

1 个答案:

答案 0 :(得分:1)

根据您的评论,您正试图在列中移动项,例如:

{{11,12,13},
 {21,22,23},
 {31,32,33}}

{{31,12,13},
 {11,22,23},
 {21,32,33}}

以下代码使用了wrap函数:

g={{11,12,13},{21,22,23},{31,32,33}}

function shifItemWithinRow( array, shift )
    shift = shift or 1 -- make second arg optional, defaults to 1
    for i = 1, shift do
        table.insert( array, 1, table.remove( array, #array ) )
    end
end

function shifItemWithinColumn( grid, columnID, shiftCount )
    shiftCount = shiftCount or 1 -- make second arg optional, defaults to 1

    -- copy all items from g into new table, shifted:
    local numRows = #grid
    local newCol = {}
    for i=1,numRows do -- 
         local newI = i+shiftCount
         if newI > numRows then newI = newI - numRows end
         if newI < 1       then newI = numRows - newI end
         newCol[newI] = grid[i][columnID]
    end

    -- copy all items into grid
    for i=1,numRows do -- # each row
         grid[i][columnID] = newCol[i]
    end
end

function printGrid(g)
    for i, t in ipairs(g) do 
        print('{' .. table.concat(t, ',') .. '}')
    end
end

printGrid(g)
shifItemWithinColumn(g, 1) -- shift col 1 by +1
print()
printGrid(g)
print()
shifItemWithinColumn(g, 1, -1)  -- shift col 1 by -1
printGrid(g)

此示例将列移动+1然后按-1(因此final与start相同)。