.NET 6 zavádí nový typ kolekce, PriorityQueue, který, jak název napovídá, přidává podporu priorit nad rámec běžné fronty. Poznámka: JeNe-bezpečný vůči vláknům, musíte věnovat pozornost bezpečnostním problémům s vlákny.
Zdroj:Přihlášení k hypertextovému odkazu je viditelné.
Rozjet
Podívejme se na jednoduchý příklad použití:
Příklad výstupu:
Vidíte, že pořadí výstupů je opačné než pořadí, které jsme přidali. PriorityQueue začíná s nejmenší prioritou při vyřazení fronty, čím menší hodnota, tím vyšší priorita, tím vyšší priorita, čím vyšší priorita, tím vyšší priorita, tím větší priorita výstup, pokud chceme nejdřív maximální výstup, je to v pořádku? Odpověď je ano, ale musíme si stanovit vlastní pravidla pro porovnání priorit, můžete se podívat na následující příklad
Scény
S automatickým tříděním s prioritou můžeme zvážit použití PriorityQueue, když potřebujeme provést nějaké automatické třídění
Fronta zpráv
S PriorityQueue lze implementovat frontu prioritních zpráv, která umožňuje uživatelům při odeslání zprávy určit prioritu a při jejím spotřebování bude prioritizována.
V uvedeném příkladu specifikujeme int jako výchozí typ priority a některé zprávy sloučíme do fronty, ale často je zpráv mnoho a mohou nastat situace se stejnou prioritou, které můžeme použítČas a int jako federovaný typ priorityMůžete se odvolat na následující příklad:
Příklad výstupu je následující:
Z výše uvedených výsledků je vidět, že v případě priority nejprve zpracujeme zprávy s menším časem, nebo můžeme třídění přizpůsobit vlastním potřebám a logiku porovnání priorit.
Hodnost
PriorityQueue lze také použít v mnoha aplikacích pro hodnocení pořadí, například v žebříčku studentských výkonů
Podívejte se na ukázkový kód níže:
Výše uvedený seznam je seznam známek, stačí napsat pár testovacích dat, přes PriorityQueue UnorderedItems můžeme data získat před tříděním, a je to také pořadí, v jakém se připojujeme do fronty (Enqueue), výchozí porovnání je malé jako první, tedy nejnižší skóre, pak chceme třídit od největšího k nejmenšímu a musíme přizpůsobit způsob porovnání.
Výše uvedený High2LowComparer je vlastní porovnání, které je ve skutečnosti inverzí výsledku porovnání, a kód je následující:
Výstup výše je následující:
Více
V Redis existuje typ dat zset(sortedSet), který dokáže podobné věci, ale stále existují určité rozdíly mezi zset a PriorityQueue, zset je množina, kolekce, která automaticky deduplikuje, zatímco PriorityQueue je stále Queue nebude deduplikována, zset může upravit prioritu (skóre) odpovídajícího prvku, ale PriorityQueue V současnosti není podporováno měnit odpovídající prioritu prvku
PriorityQueue může některé naše problémy vyřešit, ale je třeba mít na paměti několik věcí při jeho používání:
- Za prvé, pokud je priorita stejná, může být pořadí výstupu odlišné, což určuje jeho interní implementační algoritmus, a pořadí nelze striktně zaručit
- PriorityQueue není bezpečný pro vlákna a je třeba upozornit na problémy s bezpečností vláken
- Metoda Peek v PriorityQueue načte pouze nadcházející prvek ve frontě, ale neodstraní jej z fronty
(Konec) |