lua环状表

游戏中关于抽奖日志常常需要维护一个lua表,如果每次操作都是在头部,会引起后边元素进行内存拷贝。

一般来说中奖日志都有一个长度上限,当超过时就需要将最前边的日志删除,而这个是我们不愿意看到的。

这里实现了一个环状表,当长度超过上限后会自动将第一个位置替换未新加入的元素。

结构如下:

--[[

环状表

var={

  index,--即将使用的下标

  maxNum,--最大长度,超过从头开始(可扩展)

  items = {

    item,--日志节点

    ...

  }

}

]]

local mod = {}

local function correctIndex(list)

  if list.index > list.maxNum then

    list.index=1

  end

end

function mod.initList(list,maxNum)

  assert(maxNum>0)

  list.index=1

  list.maxNum=maxNum

  list.items={}  

end

function mod.getCount(list)

  return #list.items

end

--表长变更

function mod.resetMaxNum(list,maxNum)

  assert(maxNum>0)

  local oldItmes={}

  mod.for_each(list,function(item)

    table.insert(oldItems,item)

  end)

  if maxNum>=#oldItems then

    list.items=oldItems

  else

    list.items={}

    local items=list.items

    for i=#oldItem-maxNum+1,#oldItems do

      table.insert(items,oldItems[i])

    end

  end

  list.maxNum = maxNum

  list.index=#list.items+1

  correctIndex(list)

end

--添加元素

function mod.addItem(list,item)

  list.items[list.index]=item

  list.index=list.index+1

  correctIndex(list)

end

--遍历

function mod.for_each(list,f)

  local index = list.index

  local items = list.items

  local cnt = #items

  for i=index,cnt do

     f(items[i])

  end

  for i=1,index-1 do

     f(items[i])

  end

end

--反向遍历

function mod.for_each_reverse(list,f)

  local index = list.index

  local items = list.items

  local cnt = #items

  for i=index-1,1,-1 do

     f(items[i])

  end

  for i=cnt,index,-1 do

     f(items[i])

  end

end

function mod.clear(list)

  mod.initList(list,list.maxNum)

end

return mod

 

使用方法

local loglist = require("loglist")

local maxloglen = 50

local getLog()

  local var = getSysVar()

  if not var.actorLog then

    var.actorLog={}

    loglist.initList(var.actorLogInfo,maxloglen)

  end

  return var.actorlog

end

--添加日志

local addlog(log)

  local actorlog = getactorlog()

  loglist.additem(actorlog,log)

end

--遍历

local logs = getactorlog()

local len = loglist.getcount(logs)

loglist.for_each_reverse(logs,function(log)

  ...

  end)

end

posted @ 2021-02-22 10:58  乐swap火  阅读(100)  评论(0编辑  收藏  举报