Kolejki

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Kolejka to liniowa struktura danych z kolekcją przedmiotów.W Roblox istnieją dwa rodzaje kolejek: zwykłe kolejki , które podążają za zasadą first-in-first-out (FIFO), oraz priorytetowe kolejki , które mają priorytety dla przedmiotów w kolejce, które określają kolejność dostępu do danych.Przedmioty w obu typach kolejek mogą być dowolnym typem danych Luau .

Kolejka jest wbudowaną strukturą danych usługi nieprzechowywania danych nie trwałych , dla której możesz bezpośrednio wezwać wbudowane funkcje, aby uzyskać kolejkę i dodać, przeczytanelub usunąć dane z kolejki.W przypadku każdego innego użytku, takiego jak planowanie zadań i obsługa żądań w Twoim doświadczeniu, możesz używać tabel, aby wdrożyć kolejki na posiadaćrękę.

Zwykłe kolejki

Regularne kolejki są utrzymywane w kolejności FIFO, w której wszystkie przedmioty są dodawane do tyłu kolejki i odczytywane lub usuwane w tej samej kolejności, w jakiej są dodawane, od przodu do kończyć.

kolejność, w jakiej zwykła kolejka dodaje, czyta i usuwa przedmioty

Kolejki priorytetowe

Kolejki priorytetowe nie podążają za zasadą FIFO, w której każdy element może zostać dodany z numerem priorytetu, który wskazuje na to, czy jest czytany lub usuwany.Przedmiot na końcu kolejki priorytetowej ma priorytet domyślny 0, a przedmiot na początku kolejki ma najwyższy ustawiony priorytet, który wynosi 5 w następnym przykładzie.

Ustawienie priorytetu przedmiotu zmienia kolejność, w której kolejka odczytuje przedmioty

W tym przykładzie dodaje się przedmiot z ustawionym priorytetem 3 do kolejki.Kolejka umieszcza nowy element za wszystkimi istniejącymi przedmiotami z ustawionym priorytetem 3 lub więcej.Aby umieścić przedmiot na czele kolejki, musisz ustawić priorytet wyższy niż obecnie najwyższy ustawiony priorytet.W tym przykładzie musisz ustawić priorytet na 6 lub wyższy.

Kolejki priorytetowe są przydatne w sytuacjach, w których chcesz czytać lub uzyskiwać dane w oparciu o kolejność ważności, a nie kolejność dodawania.Możesz ustawić priorytet jako liczbę całkowitą, dodając przedmiot, a procesy kolejki przetwarzają przedmioty o wyższym priorytecie przed przedmiotami o niższym priorytecie.Na przykład możesz używać kolejek priorytetowych do matchmakingu, przypisując wyższe priorytety użytkownikom, którzy długo czekali.

Wdroż kolejki

Możesz używać wbudowanych kolejek MemoryStoreService lub używać tabel do wdrożenia kolejek dla wszystkich innych zastosowań.Poniższy przykład kodu pokazuje wdrożenie zwykłej kolejki .Aby skorzystać z tej implementacji dla swojego doświadczenia, powinieneś zapisać ją jako ModuleScript i przechować w ReplicatedStorage, aby Twoja kolejka była dostępna zarówno dla klienta, jak i serwera.

Wdrożenie zwykłej kolejki za pomocą tabeli

--!ściśle
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
-- Sprawdź, czy kolejka jest pusta
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- Dodaj wartość do kolejki
function Queue.enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- Usuń wartość z kolejki
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

Poniższy przykład kodu jest przykładem użycia jako Script pod Workspace .Możesz modyfikować kod, wpisywaći lokalizację przechowywania, aby dopasować do własnego użytku, pod warunkiem, że masz poprawnie przechowany poprzedni kod próbny implementacji.

Przykład regularnego użycia kolejki

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Queue = require(ReplicatedStorage:WaitForChild("Queue"))
local myQueue = Queue.new()
-- Dodaj kilka wartości do kolejki
myQueue:enqueue(5)
myQueue:enqueue(10)
myQueue:enqueue(15)
-- mój kolejnik = { 5, 10, 15 }
-- Usuń jedną wartość z kolejki
local first = myQueue:dequeue()
print("The first value added to the queue was", first)
-- mój kolejnik = {10, 15}
-- Dodaj więcej wartości do kolejki
myQueue:enqueue(20)
myQueue:enqueue(25)
myQueue:enqueue(30)
-- mój kolejnik = {10, 15, 20, 25, 30}
-- Usuń inną wartość z kolejki
local second = myQueue:dequeue()
print("The second value added to the queue was", second)
-- myQueue = { 15, 20, 25, 30 }