2010-03-31 17 views
5

Perdóneme si esta es una pregunta intentada, pero me está costando un poco descubrirlo.Cola de prioridad de Java con un comparador anónimo personalizado

Actualmente tengo un Nodo de clase, y cada 'nodo' es un cuadrado en un laberinto. Estoy tratando de implementar el algoritmo A *, por lo que cada uno de estos nodos tendrá un miembro de datos f-cost (int) dentro de él. Me preguntaba si hay una manera de que pueda crear una cola de prioridad de estos nodos, y configurar la variable f-cost como el comparador.

He visto ejemplos en línea, pero todo lo que puedo encontrar son colas de prioridad de cadenas. ¿Puedo implementar Comparator para la clase Node? ¿Esto me permitiría acceder al miembro de datos almacenado dentro de él?

¡Muchas gracias!

Respuesta

8

Absolutamente.

Se puede utilizar un PriorityQueue basado en un anónimo Comparator pasado al constructor:

int initCapacity = 10; 
PriorityQueue<Node> pq = new PriorityQueue<Node>(initCapacity, new Comparator<Node>() { 
    public int compare(Node n1, Node n2) { 
     // compare n1 and n2 
    } 
}); 
// use pq as you would use any PriorityQueue 

Si su clase Node ya implementa Comparable que ni siquiera es necesario definir un nuevo Comparator, ya que el orden será usado por defecto. Salvo cualquier otro método, se usará el orden natural entre los objetos.

+0

Gracias! Parece que solo estaba teniendo un poco de dificultad para descubrir la anulación, ¡lo has dejado en claro! – Bharat

1

De los Javadocs:

Una cola de prioridad ilimitada basada en un montón prioridad. Esta cola órdenes elementos de acuerdo con una orden especificado en el tiempo de construcción, que se especifica ya sea de acuerdo con su orden natural (ver Comparable), o según un Comparador

Además, PriorityQueues soportan tipos de datos genéricos . Por lo tanto, si implementa Comparable en su clase Node, puede crear un PriorityQueue<Node> y usarlo normalmente.

Alternativamente, hay un constructor PriorityQueue(int initialCapacity, Comparator<? super E> comparator) que toma un Comparador como parte del constructor PriorityQueue. Si prefiere este método, su clase de nodo no necesita contener el código adicional necesario al heredar Comparable.

0

Hay una clase PriorityQueue en java.util. Puede usar eso y usará ordenamiento natural (el nodo implementa Comparable) o un comparador suministrado en el constructor (si no quiere ese código dentro de su clase Node). Cualquier clase puede acceder a cualquier dato dentro de otro siempre que lo permita al hacer un campo no privado (estilo POO potencialmente malo) o al proporcionar un método de acceso público int getG(), public int getH(), public int getF() .

1
public class Node implements Comparable<Node>{ 

    public int compareTo(Node o) { 
     // your comparative function 
     return 0; 
    } 

}

si compareTo devuelve un int negativo, significa "menor que", 0 significa "iguales", 1 significa "mayor que"

que una función es todo lo que necesita ser capaz de usar PriorityQueue.

EDITAR: la comparación es de otra manera, lo eché a perder.-1 < | 0 = | Ya leí los de derecha a izquierda por alguna razón.

+0

¡Gracias! Estaba bastante encaminado, excepto por los bits de comparación, y el + ve, -ve lo deja en claro. Love the Invader Zim avatar btw ^^ – Bharat

+1

Tenga cuidado, la comparación resulta ser "al revés": los valores más bajos se devuelven primero. Tiene sentido si consideramos que la cola de prioridad es una lista ordenada en orden ascendente, pero me confundió la primera vez que utilicé una, ya que esperaba que el elemento con una prioridad de 100 fuera "obviamente" de mayor rango que el que tiene prioridad 30 ...;) – TMN

Cuestiones relacionadas