คิวเป็นโครงสร้างข้อมูลเชิงเส้นที่มีการรวบรวมของรายการ มีคิวสองประเภทบน Roblox: คิวปกติ ซึ่งปฏิบัติตามหลักการแรกเข้าก่อนออก (FIFO) และ คิวลำดับความสำคัญ ซึ่งมีลำดับความสำคัญสำหรับรายการในคิวที่กำหนดลำดับการเข้าถึงข้อมูล รายการในทั้งสองประเภทของคิวสามารถเป็นประเภทข้อมูล Luau ใด ๆ.
Queue เป็นโครงสร้างข้อมูลในตัวของ บริการจัดเก็บข้อมูลที่ไม่ถาวร ชื่อ MemoryStoreService ซึ่งคุณสามารถเรียกใช้งานฟังก์ชั่นในตัวเพื่อรับคิวและเพิ่ม อ่าน หรือ ลบข้อมูลจากคิวได้โดยตรง สำหรับการใช้งานอื่น ๆ เช่นการจัดตารางงานและจัดการคำขอในเกมของคุณ คุณสามารถใช้ตารางในการสร้างคิวด้วยตนเอง
คิวปกติ
คิวปกติจะถูกดูแลในลำดับ FIFO ซึ่งรายการทั้งหมดจะถูกเพิ่มไปที่ด้านหลังของคิวและอ่านหรือถูกลบออกตามลำดับเดียวกันที่ถูกเพิ่มเข้ามาจากด้านหน้าไปยังด้านหลัง

คิวลำดับความสำคัญ
คิวลำดับความสำคัญไม่ปฏิบัติตามกฎ FIFO ซึ่งแต่ละรายการสามารถถูกเพิ่มด้วยหมายเลขลำดับความสำคัญที่บ่งบอกถึงลำดับในการอ่านหรือถูกลบ รายการที่อยู่ด้านหลังของคิวลำดับความสำคัญมีลำดับความสำคัญเริ่มต้นที่ 0 และรายการที่อยู่ด้านหน้าของคิวมีลำดับความสำคัญที่ตั้งไว้สูงสุดซึ่งคือ 5 ในตัวอย่างต่อไปนี้

ในตัวอย่างนี้ รายการที่มีลำดับความสำคัญที่ตั้งไว้ที่ 3 กำลังถูกเพิ่มไปยังคิว คิวจะวางรายการใหม่ไว้เบื้องหลังรายการที่มีอยู่ทั้งหมดที่มีลำดับความสำคัญที่ตั้งไว้ที่ 3 หรือมากกว่า เพื่อวางรายการที่ด้านหน้าของคิว คุณต้องตั้งค่าลำดับความสำคัญให้สูงกว่าลำดับความสำคัญสูงสุดที่ตั้งไว้ในปัจจุบัน ในตัวอย่างนี้ คุณต้องตั้งค่าลำดับความสำคัญเป็น 6 หรือสูงกว่า
คิวลำดับความสำคัญมีประโยชน์ในสถานการณ์ที่คุณต้องการอ่านหรือเข้าถึงข้อมูลตามลำดับความสำคัญแทนที่เป็นลำดับการเพิ่ม คุณสามารถตั้งค่าลำดับความสำคัญเป็นจำนวนเต็มเมื่อเพิ่มรายการ และคิวจะประมวลผลรายการที่มีลำดับความสำคัญสูงกว่าก่อนรายการที่มีลำดับความสำคัญต่ำกว่า ตัวอย่างเช่น คุณสามารถใช้คิวลำดับความสำคัญสำหรับการจับคู่โดยการกำหนดลำดับความสำคัญที่สูงกว่าถึงผู้ใช้ที่รอนาน
การนำเข้าคิว
คุณสามารถใช้คิวในตัวของ MemoryStoreService หรือใช้ ตาราง เพื่อสร้างคิวสำหรับการใช้งานอื่น ๆ ตัวอย่างโค้ดด้านล่างนี้แสดงการนำเข้าคิว ปกติ เพื่อใช้ในเกมของคุณ คุณควรบันทึกไว้เป็น ModuleScript และเก็บไว้ใน ReplicatedStorage เพื่อให้คิวของคุณสามารถเข้าถึงได้ทั้งจากลูกค้าและเซิร์ฟเวอร์
Implementing a Regular Queue Using Table
--!strict
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("ไม่สามารถลบจากคิวที่ว่าง")
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 คุณสามารถปรับเปลี่ยนโค้ด ประเภท และตำแหน่งจัดเก็บเพื่อให้เหมาะกับการใช้งานของคุณ โดยที่คุณมีโค้ดการนำเข้าในตัวอย่างก่อนหน้านี้ที่เก็บไว้อย่างถูกต้อง
Regular Queue Usage Examplelocal 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("ค่าตัวแรกที่เพิ่มลงในคิวคือ", first)-- myQueue = { 10, 15 }-- เพิ่มค่ามากขึ้นในคิวmyQueue:enqueue(20)myQueue:enqueue(25)myQueue:enqueue(30)-- myQueue = { 10, 15, 20, 25, 30 }-- ลบค่ารายการอีกหนึ่งรายการจากคิวlocal second = myQueue:dequeue()print("ค่ารายการที่สองที่เพิ่มลงในคิวคือ", second)-- myQueue = { 15, 20, 25, 30 }