Java files d'attente de priorité et de l'interface comparable
Je viens tout juste d'apprendre à propos de la priorité des files d'attente et j'ai pensé essayer de comment il se comporte avec interface comparable.
Extrait De Code:
import java.util.PriorityQueue;
class kinga implements Comparable<Double> {
double time=909.909;
double d;
public kinga(double a) {
this.d=a;
}
public int compareTo(Double d) {
return Double.compare(d, time);
}
public static void main(String arg[]) {
PriorityQueue<kinga> r=new PriorityQueue<kinga>();
r.add( new kinga(4545.45));
r.add( new kinga(45.4));
r.add( new kinga(1235.45));
System.out.println(r.poll()+" "+r.poll()+" "+r.poll());
}
}
Il compile, mais me donne l'Exception dans thread "main" java.lang.ClassCastException: kinga cannot be cast to java.lang.Double
.
Quel est le problème ici. Quelqu'un peut-il me dire comment comparables, et les files d'attente de priorité de travail?
voir ma réponse pour la modification du code et de sortie pour la même chose.
OriginalL'auteur JohnnyHunter | 2013-08-21
Vous devez vous connecter pour publier un commentaire.
kinga
devraient être comparables aveckinga
, pasDouble
, donc:ce qui signifie que votre
compareTo
méthode doit être changé à cela:Double.compare(o.d, d)
, droit?Je ne suis pas sûr, l'original a été
Double.compare(d, time);
, donc je ne change pasMais il n'a pas de sens.
vous avez raison, il fixe
Pouvez-vous les gars prendre un coup d'oeil à mon utilisation d'un PriorityQueue dans cette question? stackoverflow.com/questions/28800287/...
OriginalL'auteur Katona
Qui n'a pas de sens. Bien que votre classe compare très bien avec le Double, le Double n'est pas au courant de cela, et ne se comparent bien avec les instances de cunégonde, qui va casser la même contrat. Et depuis un cunégonde ne peux pas comparer avec un autre king, vous ne pouvez pas utiliser un
PriorityQueue<kinga>
.Il devrait être
(notez la majuscule, à respecter les conventions de nommage Java), ce qui signifie: King instances sont comparables à l'ensemble.
La méthode compareTo devrait être
qui signifie: je suis plus grand que l'autre Cunégonde si mon
d
est plus grand que les autres Cunégonde estd
.PriorityQueue
est peut-être un autre exemple de sacrifier la sécurité de type de flexibilité: si elle avait été déclarée commeclass PriorityQueue<E extends Comparable<E>>
, alors cette erreur aurait été pris au moment de la compilation, mais alors uniquement d'éléments naturels de commande pourrait être mis dans la file d'attente+1 Pour le conduire à la maison, pensez
Kinga k; Double d;
. Dans ce cas,k.compareTo(d);
fonctionne très bien, mais qu'en est ’d'.compareTo(k)`? La file d'attente de priorité qui fera appel à la dernière, qui est la cause de l'exception.OriginalL'auteur JB Nizet
PriorityQueue<kinga>
va attendreComparable<kinga>
dans leadd
méthode. Le passage d'unComparable<Dobule>
au lieu de cela, des vomissementsClassCastException
OriginalL'auteur sanbhat
De la première à obtenir le différence entre Comparables et Comparateur interfaces.
Maintenant, pour votre question, vous pouvez faire quelque chose comme ci-dessous
D'abord créer un Comparateur de pour Cunégonde
Puis de créer votre file d'attente de priorité avec ce Comparateur dans le constructeur
Sortie est comme prévu
OriginalL'auteur Aniket Thakur