So entfernen Sie Elemente aus PriorityQueue gemäß einer Elementeigenschaft?

9

Ich versuche Maximum Waiting Time in meinem PQueue zu setzen. Dieses Maximum Waiting Time überprüft automatisch mein PQueue , wenn% code_% mehr als links wartet, um es zu entfernen. Ich habe diese Änderungen an meinem Code es funktioniert, aber es stoppt genau nach dem Entfernen der Links. Ich möchte alle Elemente aus meinem Maximum Waiting Time nach der Wartezeit entfernen. Kannst du mir sagen, was ich hier vermisse?

Das ist meine Klasse:

%Vor%     
medo0070 23.10.2015, 11:23
quelle

1 Antwort

3

Ihre Frage ist ein bisschen undurchsichtig, aber wenn ich es richtig verstehe, wollen Sie Ihre PriorityQueue überprüfen, um zu sehen, ob es Elemente gibt, die länger als eine bestimmte Zeit gewartet haben.

Ihre Verwendung von synchronized auf IntraLinkCount und InterLinkCount ist, wie bereits erwähnt, ein bisschen seltsam. Es gibt eine ziemlich unbekannte Alternative, die atomare Integer-Klasse AtomicInteger (im Paket java.util.concurrent.atomic :

%Vor%

Dies funktioniert wie Sie wollen.

Das zweite Problem besteht darin, dass Sie die Methode poll() verwenden. Dadurch wird das oberste Element aus der Warteschlange entfernt. Vielleicht möchten Sie stattdessen peek() verwenden und dann remove() nur verwenden, wenn das zurückgegebene Verknüpfungsobjekt link.waitingInQueue() > MaxWaitTime ?

erfüllt

Übrigens wird Ihre Warteschlange Artikel gemäß ihrer "natürlichen Reihenfolge" zurückgeben. Dies bedeutet, dass die Methode compareTo verwendet wird und die "kleinste" zuerst aus der Warteschlange zurückgegeben wird. Ich denke, Sie möchten vielleicht ein benutzerdefiniertes compareTo implementieren, das stattdessen den längsten wartenden Link zuerst platziert?

Sie könnten auch Ihre% erstellen. co_de% mit einem benutzerdefinierten PriorityQueue Objekt statt.

In etwa so:

%Vor%

Wenn Sie Glück haben, auf Java 8 zu sein, könnte eine Magie wie diese hilfreich sein:

%Vor%     
Tomas 27.10.2015 17:47
quelle

Tags und Links