2012-02-06 28 views
1

私はJava APIを使用してプライオリティキューを作成しましたが、の最後にプライオリティキューから特定の要素を削除します。私はそれがコンパレータと何かをしなければならないことを知っているが、私はそれを把握することはできません。助けてもらえますか?ここに私のコードです:優先度キューから特定の要素を削除するにはどうすればよいですか?

public static void main(String[] args) 
{ 
    PriorityQueue<Element> X = new PriorityQueue<Element>(100, new ElementComparator()); 
    X.add(new Element(30, 3)); 
    X.add(new Element(700, 4.5)); 
    X.add(new Element(100, 6.2)); 
    X.add(new Element(2, 8.1)); 
    System.out.println(X.remove(new Element(100, 6.2))); 
} 

とここに私の要素のクラスです:

private int index; 
private double value; 

public Element(int i, double v) 
{ 
    index = i; 
    value = v; 
} 

public int getIndex() { return index;}; 
public double getValue() { return value;}; 
public void setValue(double v) { value = v;}; 

そして、ここで私が作成したコンパレータです:...私はあなたの助けに感謝

public int compare(Element o1, Element o2) 
{ 
    int idx1 = o1.getIndex(); 
    int idx2 = o2.getIndex(); 
    if (idx1 < idx2) { 
     return -1; 
    } else if (idx1 > idx2) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

public boolean equals(Element o1, Element o2) 
{ 
    return o1.getIndex() == o2.getIndex(); 
} 

+0

'System.out.println(X.remove(new Element(100、6.2)));'要素が実際に 'X'から削除された場合に出力されます。または 'X'を印刷しようとしていますか? – amit

+0

'compareTo'関数はソート用です。 'remove'には等価メソッドが必要です。このメソッドの正しい署名については、以下の@johncarlの答えを参照してください。 – Perception

+0

また、小文字で始まる名前で非定数変数に名前を付けるのがよい方法です。 – amit

答えて

1

Elementオブジェクトにequals()とhashcode()を定義する必要があります:

public class Element{ 
    private int index; 
    private double value; 

    public Element(int i, double v) 
    { 
     index = i; 
     value = v; 
    } 

    public int getIndex() { return index;} 
    public double getValue() { return value;} 
    public void setValue(double v) { value = v;} 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof Element)) return false; 

     Element element = (Element) o; 

     if (index != element.index) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     return index; 
    } 
} 

ElementComparatorでequals()を定義しても、同じタスクは実行されません。

関連する問題