2016-04-05 39 views
-1

我有一個優先級隊列,其中包含一對點 我已經在該隊列上迭代並將每對點中的每個點插入樹集。樹集訂單保存 - Java

問題是我想維護優先隊列中的訂單 我應該如何實現樹集的比較器?

+0

優先級隊列產生它的順序用同樣的方法,即相同的比較? – Thomas

+0

我不能這樣做,因爲,priorty隊列包含一對代表線條的點,我的比較器使用它。我不能爲單點寫一個比較器。 – 2D3D

+0

如果一個點有多個優先級,即多個對的一部分,該怎麼辦?它是否必須是'TreeSet'或不是'LinkedHashset'更有用? – Thomas

回答

1

這是一種可能性。我並不是將這些積分本身插入到TreeSet中,而是一個跟蹤它們在PriorityQueue中的順序的包裝。這有一個好處,我們不需要修改Point類本身。

這裏的包裝類:

import java.util.PriorityQueue; 
import java.util.TreeSet; 

public class Sortable<T> implements Comparable<Sortable<T>> { 

    T element; 
    int order; 

    public Sortable(T element, int order) { 
     this.element = element; 
     this.order = order; 
    } 

    @Override 
    public int compareTo(Sortable<T> o) { 
     return order - o.order; 
    } 

} 

現在你可以這樣做:

public void transfer(PriorityQueue<PointPair> from, TreeSet<Sortable<Point>> to) { 
    PointPair pp = from.poll(); 
    int count = 0; 
    while (pp != null) { 
     to.add(new Sortable<Point>(pp.getLeftPoint(), count)); 
     count++; 
     to.add(new Sortable<Point>(pp.getRightPoint(), count)); 
     count++; 

     pp = from.poll(); 
    } 
} 
+0

如果你堅持你的問題的措辭,那'TreeSet'應該包含'Point'並且有一個'Comparator':你的'Comparator'可以有它自己的數據結構來跟蹤點的順序,比如'HashMap '這個整數在我的代碼中的作用與'int order'相同。不過,我認爲這太複雜了,但我沒有看到太多收穫。爲你決定。 –