Pourquoi ont-ils nommé PriorityQueue
si vous ne pouvez pas insertWithPriority? Cela ressemble beaucoup à un tas. Y a-t-il des différences? Si aucune différence, pourquoi était-il nommé PriorityQueue
et non Heap?
Add () fonctionne comme un insertWithPriority.
Vous pouvez définir la priorité du type souhaité à l'aide du constructeur:
PriorityQueue(int, Java.util.Comparator)
regardez sous http://download.Oracle.com/javase/1,5.0/docs/api/Java/util/PriorityQueue.html
L'ordre donné par le comparateur représentera la priorité dans la file d'attente.
Le PriorityQueue par défaut est implémenté avec Min-Heap, c'est-à-dire que l'élément supérieur est le minimum dans le tas.
Afin d'implémenter un max-heap, vous pouvez créer votre propre comparateur:
import Java.util.Comparator;
public class MyComparator implements Comparator<Integer>
{
public int compare( Integer x, Integer y )
{
return y - x;
}
}
Ainsi, vous pouvez créer un tas min et un tas max de la manière suivante:
PriorityQueue minHeap=new PriorityQueue();
PriorityQueue maxHeap=new PriorityQueue(size, new MyComparator());
Pour max-heap, vous pouvez utiliser:
PriorityQueue<Integer> queue = new PriorityQueue<>(10, Collections.reverseOrder());
De les PriorityQueue
JavaDocs :
Une file d'attente prioritaire illimitée basée sur un segment de priorité. Les éléments de la file d'attente prioritaire sont ordonnés selon leur ordre naturel, ou par un
Comparator
fourni au moment de la construction de la file d'attente, selon le constructeur utilisé.
La priorité est censée être une propriété inhérente des objets dans la file d'attente. Les éléments sont classés en fonction d'une sorte de comparaison. Pour insérer un objet avec une priorité donnée, il vous suffit de définir les champs de l'objet qui affectent l'ordre, et add()
.
Et, comme @ Daniel commenté,
Généralement Java Les objets sont nommés en fonction des fonctionnalités qu'ils fournissent, et non en fonction de la façon dont ils sont implémentés.
File d'attente prioritaire représentée comme un tas binaire équilibré : les deux enfants de la file d'attente [n] sont la file d'attente [2 * n + 1] et la file d'attente [2 * ( n + 1)]. La file d'attente prioritaire est ordonnée par le comparateur , ou par l'ordre naturel des éléments .
Voici un code de travail pour maxHeap et minHeap en utilisant PriorityQueue
-
class HeapDemo {
private final static int HEAP_SIZE = 10; //size of heap
//INNER CLASS
static class maxHeapComparator implements Comparator<Integer> {
@Override
public int compare (Integer x, Integer y) {
return y-x; //reverse order
}
}
public static void main(String[] args) {
PriorityQueue<Integer> minHeap = new PriorityQueue<>(HeapDemo.HEAP_SIZE);
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(HeapDemo.HEAP_SIZE, new maxHeapComparator());
for(int i=1; i<=HeapDemo.HEAP_SIZE; ++i){
int data = new Random().nextInt(100) +1; //number between 0 to 100
minHeap.add(data);
maxHeap.add(data);
}
System.out.print("\nMIN Heap : ");
Iterator<Integer> iter = minHeap.iterator();
while(iter.hasNext()){
System.out.print(iter.next() + " ");
}
System.out.print("\nMAX Heap : ");
iter = maxHeap.iterator();
while(iter.hasNext()) {
System.out.print(iter.next() + " ");
}
}
}
échantillon o/p:
MIN Heap : 20 32 37 41 53 91 41 98 47 86
MAX Heap : 98 91 41 53 86 20 37 41 32 47
De http://docs.Oracle.com/javase/7/docs/api/Java/util/PriorityQueue.html
Une file d'attente prioritaire illimitée basée sur un segment de priorité. Les éléments de la file d'attente prioritaire sont ordonnés selon leur ordre naturel, ou par un Comparateur fourni lors de la construction de la file d'attente
pour entier, long, flottant, double, caractère, booléen (c'est-à-dire les types de données primitifs), le ordre naturel est un ordre croissant, c'est pourquoi Arrays.sort (arr) {où arr est un tableau de primitives type de données} trie la valeur de arr dans l'ordre croissant. Vous pouvez changer l'ordre naturel en utilisant un Comparateur
Le comparateur peut être utilisé de deux manières:
L'un des moyens est de savoir comment DpGeek a montré
Une autre façon consiste à utiliser classe anonyme . Par exemple
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer x, Integer y) {
return y - x;
}
});
Arrays.sort(arr, (Integer x, Integer y) -> y - x);
Cela trie le tableau arr dans l'ordre décroissant