2017-07-16 9 views
0

私はサンプル注文オーダー(Exchangeドメイン内)を実装しており、JavaでPriorityQueueを使用して購入側と売り側を実装しています。
PriorityQueueはカスタムコンパレータで降順に注文しません

購入側は降順にする必要があります。売り側は昇順にする必要があります

PriorityQueue<ArrayList<Order>> bookSide; 

各面は価格ポイントで構成され、各ポイントには注文のリストがあります。

Buy/Sell Side

私のバイサイドが正常に動作します。

これは私の売り側です。私はこれが降順に命じられることを望む。 101が追加されると

sellSide = new PriorityQueue<ArrayList<Order>>(new Comparator<ArrayList<Order>>() { 

    @Override 
    public int compare(ArrayList<Order> arg0, ArrayList<Order> arg1) { 
     // below two conditions are highly unlikely to happen 
     // as the the elements are added to the list before the list is 
     // added to the queue. 
     if (arg0.size() == 0) { 
      return -1; 
     } 
     if (arg1.size() == 0) { 
      return -1; 
     } 
     // all the elements in a list have a similar price 
     Order o1 = arg0.get(0); 
     Order o2 = arg1.get(0); 
     int r = (int) (o1.getPrice() - o2.getPrice()); 
     return r; 

    } 

}); 

私は100100101と99

を追加し、それが正しく100以下101(100のリスト)を追加します。しかし、99を追加すると、それは注文を破棄し、99,101,100になります。

何が間違っているのかわかりません。

私を助けてください。

EDIT

これは私がリストに要素を追加する方法です。 pricelongです。

ArrayList<Order> pricePoint = sidePoints.get(price); 
if (pricePoint == null) { 
    pricePoint = new ArrayList<>(); 
    pricePoint.add(order); // I want the list to be non-empty when adding to queue 
    bookSide.add(pricePoint); 
} else { 
    pricePoint.add(order); 
} 
+0

私はそれが唯一の問題だかどうかわからないんだけど、あなたの 'compare'方法は'コンパレータの契約に違反します'インタフェース。 – Eran

+0

@エラン:どうか教えてください。 –

+0

注文の要素を何に追加しますか?リストに?もしそうなら: 'PriorityQueue'は含まれている' ArrayList'を変更するときに魔法のように順序を変更することはありません。サイドノート: 'arg0.size()== arg1.size()== 0'の場合、' 0'ではなく '-1'を返します。 [ 'Comparator.compareは()'](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-TT-)のみ '戻ることができる-1' 、 '0'、および '1'である。リストの1が空の場合、あなたは常に-1を返し、しかしの符号が(x、y)を比較する – dhke

答えて

3

PriorityQueueについての誤解があるようです。 これをクリアしようとしましょう。

しかし、99を追加すると、その順序が破棄され、99,101,100になります。

まず、Javadoc of PriorityQueueからの重要なリマインダー:

優先度ヒープに基づく、無制限の優先度キュー。

ここで重要な用語は、ヒープです。 ヒープでは、要素はシーケンス内で順序付けされません。 ヒープは木のような構造です。 すべてのノードは他のすべてのノードと比較して一貫して順序付けされています以下はです。 つまり、 同じレベルのノードの順序付けに関しては何の保証もありません。

ヒープの昇順(最小ヒープ)は、先頭の要素が最小であることを保証します。 先頭の要素をポップした後、 は、次の先頭の要素が残りの要素の中で最小になります。 など。

あなたがソートされた要素のリストをしたい場合は、 あなたは一つのヒープ1からポップし、それを構築する必要があります。 また、 あなたは、単にリストを使用 とCollections.sortを使用して、それを並べ替えることができます。

余談として

、 等がコメントで指摘したように、比較方法の 実装はComparatorインターフェースの契約違反:abの正確に1つが空である場合 を 両方compare(a, b)compare(b, a) -1を返し、ロジックを壊すことa < bb < a、 を暗示。

修正は簡単ですが、私はまた少しに実装の残りの部分を簡素化:

@Override 
public int compare(ArrayList<Order> arg0, ArrayList<Order> arg1) { 
    if (arg0.isEmpty()) { 
    return -1; 
    } 
    if (arg1.isEmpty()) { 
    return 1; 
    } 

    return Integer.compare(arg0.get(0).getPrice(), arg1.get(0).getPrice()); 
} 
+0

ありがとうございます。しかし、あなたの比較方法はまだ私の問題を解決しません。 :( –

+0

そしてリストの最初の要素に従ってソートされたリストのリストが必要です –

+0

@PraneethNilangaPeiris私の主なポイントであり、解決策の鍵はヒープについての議論です。 。あなたがまだそれを得ることはありませんようです。のは、これを理解してみましょう。あなたがあなたの記事で言ったときに正確に何を意味する「しかし、私は99を追加したとき、それは秩序を破壊し、99101100になります。」? – janos

関連する問題