2013-08-21 2 views
7

Я только что узнал о очередях приоритетов и подумал, что попробую, как он ведет себя с сопоставимым интерфейсом.Очереди приоритетов Java и сопоставимый интерфейс

Код сниппета:

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()); 
    } 
} 

Он компилирует, но дает мне исключение в нить "основной"java.lang.ClassCastException: kinga cannot be cast to java.lang.Double.

Что здесь не так. Может ли кто-нибудь сказать мне, как работают сопоставимые очереди и очереди приоритетов?

+0

см. Мой ответ для отредактированного кода и вывода для него. –

ответ

8

kinga должен быть сравним с kinga, не Double, так:

class kinga implements Comparable<kinga> 

, который означает, что ваш метод compareTo должен быть изменен следующим образом:

public int compareTo(kinga o) { 
    return Double.compare(o.d, d); 
} 
+0

Вы имеете в виду 'Double.compare (o.d, d)', правильно? –

+0

@JBNizet Я не уверен, оригинал был 'Double.compare (d, time);', поэтому я не изменил это – Katona

+0

Но это не имеет никакого смысла. –

2

PriorityQueue<kinga> будет ожидать Comparable<kinga> в методе add , Передача Comparable<Dobule> вместо этого, бросает ClassCastException

8
class kinga implements Comparable<Double> 

Это не имеет смысла. Хотя ваш класс будет сравнивать штраф с Double, Double не знает об этом и не будет сравнивать штраф с экземплярами kinga, что нарушит контракт Comparable. И поскольку королевство не может сравниться с другим королевством, вы не можете использовать PriorityQueue<kinga>.

Это должно быть

class Kinga implements Comparable<Kinga> 

(обратите внимание на верхний регистр, соблюдать Java именования), что означает: экземпляры KINGA сопоставимы друг с другом.

Метод CompareTo должен быть

@Override 
public int compareTo(Kinga other) { 
    return Double.compare(this.d, other.d); 
} 

что означает: я больше, чем другие Кинги, если мой d больше, чем другие Кинги d.

+0

, кстати, 'PriorityQueue 'возможно, является еще одним примером безопасности типа жертвоприношения для гибкости: если бы он был объявлен как класс PriorityQueue >', то эта ошибка была бы поймана во время компиляции, но тогда могут быть установлены только элементы с естественным упорядочением в очередь – Katona

+2

+1 Чтобы догнать его домой, рассмотрите 'Kinga k; Двойной d; '. В этом случае 'k.compareTo (d);' работает отлично, но как насчет 'd.compareTo (k) '? Очередь приоритетов иногда вызывает последнее, что и вызывает исключение. – yshavit

0
Can somebody tell me how comparable and priority queues work? 

Сначала получите difference между сопоставимыми и компараторов интерфейсов.

Теперь ваш вопрос вы можете сделать что-то вроде ниже

Сначала создайте компаратор для Кинги

class comparableKinga implements Comparator<kinga> { 

@Override 
public int compare(kinga o1, kinga o2) { 
    return Double.compare(o1.getD(),o2.getD()); 
} 
} 

Затем создайте очередь приоритета с этим компаратор в конструкторе

class kinga { 

double d; 

public kinga(double a) { 
    this.d = a; 
} 

public double getD() { 
    return this.d; 
} 

@Override 
public String toString() { 
    return "kinga{" + 
      "d=" + d + 
      '}'; 
} 

public static void main(String arg[]) { 
    PriorityQueue<kinga> r = new PriorityQueue<kinga>(11,new comparableKinga()); 


    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()); 
} 
} 

Выход как ожидалось

kinga{d=45.4} kinga{d=1235.45} kinga{d=4545.45} 
+0

Можете ли вы взглянуть на мое использование PriorityQueue в этом вопросе? http://stackoverflow.com/questions/28800287/how-to-restore-the-priorityqueue-to-its-initial-state-before-the-method-call?noredirect=1#comment45875800_28800287 – committedandroider

Смежные вопросы