/ / Ako nakonfigurovať Java Priority Queue tak, aby ignoroval duplikáty? - java, zbierky, fronty priorít

Ako nakonfigurovať prioritnú frontu Java na ignorovanie duplicít? - java, zbierky, fronta priorít

Myslel som, že add () má ignorovať duplikáty, ale môj výstup má duplikáty. Ako neukladám duplikáty?

Chcel by som tiež vedieť, ako prioritný front kontroluje, či sú dva prvky duplicitné. Hádam, že to pomocou porovnávača sa rovná, ale chcem si len byť istý.

Vďaka

odpovede:

11 pre odpoveď č. 1

Tu je časť z PrioritnýQueue Javadoc:

Táto fronta objednáva prvky podľa objednávkyšpecifikované v čase výstavby, ktoré je určené buď podľa ich prirodzeného poradia (pozri porovnateľné), alebo podľa porovnávača, v závislosti od toho, ktorý konštruktor sa používa.

Takže áno, PriorityQueue používa porovnávač (ak ste ho zadali ako argument konštruktora) alebo používa metódu porovnania (...) (prvky musia implementovať porovnateľné rozhranie).

PriorityQueue umožňuje duplikáty. Ak sa tomu chcete vyhnúť, musíte implementovať svoju vlastnú verziu frontu. Môžete nájsť veľmi elegantný spôsob, ako to urobiť „Efektívna Java“, strana 85, Prípadne môžete rozšíriť triedu PriorityQueue a prepísať metódu pridania (ide o perfektné miesto, ktoré obsahuje (...) kontrola).


5 pre odpoveď № 2

A PriorityQueue v Java nemá žiadne obmedzenia, pokiaľ ide oduplikovať prvky. Ak chcete zabezpečiť, aby sa dve rovnaké položky nikdy nenachádzali vo fronte priorít súčasne, najjednoduchším spôsobom by bolo zachovať samostatný Set súbežne s frontom priorít. Zakaždým, keď chcete vložiť prvok do frontu priorít, môžete skontrolovať, či sada už neobsahuje, ak nie, potom ho pridajte do frontu množín aj priorít. Kedykoľvek odstránite prvok z frontu priorít, potom ho jednoducho odstráňte aj z množiny.

Prípadne, v závislosti od toho, ktoré operácie plánujete vykonať vo fronte priorít a od toho, ako je vo vašom prípade definovaná rovnosť, môže byť životaschopné nahradiť ju jediným. TreeSet namiesto toho, pretože to vám stále umožní vykonávať všetky dôležité operácie, ku ktorým by ste mali prístup vo fronte priorít, zatiaľ čo to navyše neumožňuje duplikáty.


4 pre odpoveď č. 3
import java.util.PriorityQueue;

public class NoDuplicates<E> extends PriorityQueue<E>
{
@Override
public boolean offer(E e)
{
boolean isAdded = false;
if(!super.contains(e))
{
isAdded = super.offer(e);
}
return isAdded;
}
public static void main(String args[])
{
PriorityQueue<Integer> p = new NoDuplicates<Integer>();
p.add(10);
p.add(20);
p.add(10);
for(int i =0;i<=2;i++)
{
System.out.println(p.poll());
}

}
}

3 pre odpoveď č. 4

Sady sú jediné veci, ktoré ignorujú duplikáty. Zoznamy a fronty nie. (Prepojený zoznam je front)

Ak chcete vynechať duplikáty, môžete skontrolovať, či zadaný záznam () je rovnaký ako predchádzajúci a ignorovať ho. Porovnanie môžete vykonať ľubovoľným spôsobom. ;)


0 pre odpoveď č. 5

Môžete vytvoriť množinu hash a preniesť objekt sady hash do prioritnej fronty. Jedným z konštruktorov prioritnej fronty je

PriorityQueue q = new PriorityQueue(SortedSet s)

Kód na implementáciu prioritného frontu bez duplikátov je

import java.util.Comparator;
import java.util.HashSet;
import java.util.PriorityQueue;

public class DatabaseConn {

public static void main(String[] args) {

HashSet<Integer> s = new HashSet<>();
s.add(10);
s.add(20);
s.add(5);
s.add(10);

PriorityQueue<Integer> q = new PriorityQueue<>(s);
System.out.println(q);

}

}