队列

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

队列是一种线性数据结构,包含一集项目。Roblox 上有两种类型的队列:常规队列,遵循第一进入第一出(FIFO)原则,和 优先级队列,其中队列中的项目有优先级,决定数据访问顺序。两种类型的队列中的项目可以是任何 Luau 数据类型

队列是 非持久数据存储服务 名为 MemoryStoreService 的内置数据结构,您可以直接调用内置函数来获取队列并将数据添加、已读或删除到队列。对于任何其他用途,例如在体验中安排任务和处理请求,您可以使用表来自定义队列。

常规队列

常规队列在 FIFO 顺序中保持,所有项目都添加到队列的后端,并以同样的顺序阅读或删除,从前到结束。

常规队列添加、阅读和删除项目的顺序

优先级队列

优先级队列不遵循 FIFO 规则,每个项目可以添加一个优先级号码,该号码表示其是否已被阅读或删除。优先级队列的后端项目的默认优先级为 0,前端项目的最高设置优先级为下列示例中的 5。

一个物品的设置优先级改变了队列阅读物品的顺序

在这个例子中,一个拥有设置优先级为 3 的项目被添加到队列。队列将新项目放在具有设置优先级为 3 或更多的所有现有项目后面。要将物品放在队列的前端,您需要将优先级设置高于当前最高设置优先级。在这个例子中,您需要将优先级设置为 6 或更高。

优先级队列对于那些情况有用,在那些情况下您想要根据重要程度的顺序读取或访问数据,而不是按添加顺序。您可以在添加物品时设置优先级为整数,队列会在低优先级物品之前处理优先级更高的物品。例如,你可以使用优先级队列来进行匹配,将更高的优先级分配给那些已经等待很长时间的用户。

实现队列

您可以使用内置队列 MemoryStoreService 或使用 表格 来实现所有其他用途的队列。以下代码示例显示了实现一个 普通队列 。要使用此实现为您的体验,您应该将其保存为 ModuleScript 并存储在 ReplicatedStorage 中,以便您的队列对客户端和服务器都可用。

使用表实现普通队列

--!严格
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

以下代码示例是作为 下的使用示例。您可以修改代验证码、类输入和存储位置,以满足自己的使用需求,只要您有以前的实现代码样本正确存储。

常规队列使用示例

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Queue = require(ReplicatedStorage:WaitForChild("Queue"))
local myQueue = Queue.new()
-- 向队列添加一些值
myQueue:enqueue(5)
myQueue:enqueue(10)
myQueue:enqueue(15)
-- 我的队列 = { 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)
-- 我的队列 = {10、15、20、25、30}
-- 从队列中删除另一个值
local second = myQueue:dequeue()
print("The second value added to the queue was", second)
-- myQueue = { 15, 20, 25, 30 }