Cola de prioridad de Java
Frecuentes
Visto 3,746 equipos
1
Estoy tratando de implementar PriorityQueue. Esta PriorityQueue va a contener instancias de la clase Task. Estas instancias de Tarea deben organizarse de tal manera que las instancias que tienen mayor "prioridad" estén al principio de la Cola. En resumen, las instancias deben estar en orden descendente de prioridad.
private static Queue<Task> testQ = new PriorityQueue<Task>(11, new TaskQueueComparator());
/*** Comparator ***/
public class TaskQueueComparator implements Comparator<Task> {
public int compare(Task task1, Task task2) {
return task2.priority - task1.priority;
}
}
/**** Task definition **/
public class Task {
public int priority;
}
/**** Code in main() ****/
Task pe11 = new Task();
pe11.priority = 3;
testQ.add(pe11);
pe11 = new Task();
pe11.priority = 1;
testQ.add(pe11);
pe11 = new Task();
pe11.priority = 2;
testQ.add(pe11);
void displayQueue() {
int size = testQ.size();
for (int k = 0; k < size; k++)
{
Task p = testQ.poll();
System.out.format("Task Priority %d \n", p.priority); // The result I am getting is 3 1 2.. I was expecting 3 2 1
}
Como se muestra en el comentario, esto genera 3,1,2 en lugar de 3,2,1 como esperaba. ¿Puede alguien decirme qué error estoy haciendo aquí? Cada vez que elimino o agrego una tarea de/a la cola, la cola debe organizar las tareas en orden descendente de prioridad.
Házmelo saber.
Gracias Josh
2 Respuestas
3
FYI, PriorityQueue solo devuelve los elementos en orden de prioridad cuando sondea () la cola. Encontré este de la manera difícil cuando me cansé de repetirlo hace mucho tiempo. Además, solo realiza la comparación en la inserción. Entonces, si su prioridad cambia mientras está en la cola, obtendrá un comportamiento muy extraño.
Cambiando su código a lo siguiente:
void displayQueue() {
while (!testQ.isEmpty())
{
Task p = testQ.poll(); // poll, you want to remove the head
System.out.format("Task Priority %d \n", p.priority);
}
}
pude conseguir:
Tarea Prioridad 3
Tarea Prioridad 2
Tarea Prioridad 1
Respondido 27 Jul 12, 17:07
no debería reemplazar peek
poll
en el código original producen el mismo comportamiento? - dennis meng
peek solo devolverá la cabeza, que es 3. El código original solo muestra 3, 3, 3. - jyro117
soy consciente Por eso pregunté si simplemente cambiando el código original para llamar poll
en cambio, también soluciona el problema. - dennis meng
Lo siento, malinterpretado. No lo hará porque la encuesta elimina el elemento y eso reduce el tamaño de la cola. Dado que realiza un bucle en función del tamaño, el tamaño cambiará por iteración. - jyro117
No, porque almacena el tamaño original en una variable local y la usa. - dennis meng
2
Al principio pensé que su Comparador podría no estar haciendo lo correcto con "ProcessElements", pero parece que fue un error tipográfico.
Esto devuelve "3 3 3" para mí, tal como está ...
¿Quiso decir .poll() y no peek()?
Respondido 27 Jul 12, 17:07
Lo siento, mi mal ... debería ser una encuesta y no un vistazo. - Josh
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java priority-queue or haz tu propia pregunta.
¿Qué está yendo mal? Dijiste lo que debería hacer, pero ¿qué está haciendo? - corsiKa
¿Tarea? ¿O hay alguna razón para no usar java.util.PriorityQueue? - Mike Tunnicliffe
Me dio la impresión de que el OP is usando java.util.PriorityQueue, porque de lo contrario necesitaríamos ver las implementaciones de add() (y probablemente poll()). Si no lo está, necesitamos ver más del código. - Dennis Meng
¡Obtengo menos 1 por comprensión de lectura entonces! - Mike Tunnicliffe
Además, ¿qué sucede si crea todos los elementos de la tarea a la vez? luego ¿insertar? - Dennis Meng