2013-08-21 9 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 "メイン" の例外を提供します。

ここで何が間違っていますか。同等のキューと優先キューがどのように機能するか教えていただけますか?あなたのcompareTo方法はこれに変更する必要があります意味

class kinga implements Comparable<kinga> 

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

編集コードと出力が同じです。 –

答えて

8

kingaはそうではなく、Doublekingaと同等でなければなりません。 Comparable<Dobule>を渡す代わりに、意味がありませんClassCastException

+0

'Double.compare(o.d、d)'を意味します、そうですか? –

+0

@JBNizet元は 'Double.compare(d、time);'だったので、私はそれを変更していませんでした – Katona

+0

しかしそれは意味をなさない。 –

2

PriorityQueue<kinga>add方法でComparable<kinga>を期待しています

8
class kinga implements Comparable<Double> 

を投げています。あなたのクラスはDoubleとよく似ていますが、Doubleはそれを知らず、kingaのインスタンスとは大丈夫ではなく、Comparable契約を破ります。そして王は別の王と比較できないので、PriorityQueue<kinga>を使うことはできません。

それは意味し、

class Kinga implements Comparable<Kinga> 

(Javaの命名規則を尊重するために、大文字に注意)でなければならない:キンガインスタンスは一緒に同等です。

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をComparableインターフェイスとComparatorインターフェイスの間で取得します。

今、あなたの質問のためにあなたが

下記まず次にコンストラクタで、このコンパレータと

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()); 
} 
} 
をご プライオリティキューを作成キンガ

class comparableKinga implements Comparator<kinga> { 

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

ためコンパレータを作成するような何かを行うことができます

出力は予期どおりです

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

関連する問題