队列是一个线性数据结构,包含一系列项目。 在 Roblox 上有两种类型的队列:正常队列,按照第一进第一出(FIFO)原则进行操作,和优先队列,根据队列中的项目进行优先级。 在两种队列上的任何项目都可以是 Luau 的任何数据类型。
队列是 非 persistent 数据存储服务 的内置数据结构,为其你可以直接调用内置函数来获取队列并添加、已读取或从队列中移除数据。 对于任何其他用途,例如在体验中排程任务和处理请求,你可以使用表实现队列在自拥有的头脑中。
常规队列
常规队列是按IFO顺序维护的,在该顺序中,所有物品都从前端添加到后端,并按照添加的顺序读取或移除,从前端到后结束。
优先队列
优先队列不遵循 FIFO 规则,在该规则中,每个项目可以通过优先级数字显示其读取或移除的顺序。 优先队列的后面的项目具有默认优先级 0,前面的项目具有最高优先级 5,示例如下所示:
在此示例中,一个具有 3 级设置优先级的物品正在添加到队列。队列将新物品添加到以 3 级或更高优先级的所有物品后。要将物品放置在队列的前部,您需要将优先级设置为 6 或更高。在此示例中,您需要将优先级设置为 6 或更高。
优先队列有助于在您想要读取或访问数据的顺序而不是添加顺序的情况下读取或访问数据的情况。 您可以将优先级设置为整数,当添加一个物品时,队列处理更高优先级的项目,而不是更低优先级的项目。 例如,您可以使用优先队列来匹配,通过将更高优先级设置给等待时间更长的用户。
实现队列
您可以使用 MemoryStoreService 的内置队列或使用 Class.Tables 来实现所有其他用例的队列。以下代码示例显示了实现 regular queue 的实现。要使用此实现为您的体验,您应该将其保存为 2>Class.ModuleScript2> 并
使用 Table 实现常规队列
--! 严格
local Queue = {}
Queue.__index = Queue
export type Queue<T> = typeof(setmetatable(
{} :: {
_first: number,
_last: number,
_queue: { T },
},
Queue
))
function Queue.new<T>(): Queue<T>
local self = setmetatable({
_first = 0,
_last = -1,
_queue = {},
}, Queue)
return self
end
-- 检查队列是否为空
function Queue.IsEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- 给队列添加值
function Queue.Enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- 从队列中移除一个值
function Queue.Dequeue<T>(self: Queue<T>): T
if self:IsEmpty() then
error("Cannot dequeue from empty queue")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue
下面的代码示例是一个使用示例,作为 Script 在 Workspace 下。您可以修改代验证码、输入和存储位置来满足您自己的使用方式,只要您有正确存储位置的前一份实现代码示例。
常规队列使用示例
local ReplicatedStorage = game:GetService("ReplicatedStorage")local Queue = require(ReplicatedStorage:WaitForChild("Queue"))local myQueue = Queue.new()-- 给队列添加一些值myQueue:Enqueue(5)myQueue:Enqueue(10)myQueue:Enqueue(15)-- myQueue = { 5, 10, 15}-- 从队列中移除一个值local first = myQueue:Dequeue()print("The first value added to the queue was", first)-- 我的队列 = { 10, 15}-- 给队列添加更多值myQueue:Enqueue(20)myQueue:Enqueue(25)myQueue:Enqueue(30)-- myQueue = { 10, 15, 20, 25, 30}-- 从队列中移除另一个值local second = myQueue:Dequeue()print("The second value added to the queue was", second)-- myQueue = { 15, 20, 25, 30 }