私はサンプル注文オーダー(Exchangeドメイン内)を実装しており、JavaでPriorityQueueを使用して購入側と売り側を実装しています。
PriorityQueueはカスタムコンパレータで降順に注文しません
購入側は降順にする必要があります。売り側は昇順にする必要があります。
PriorityQueue<ArrayList<Order>> bookSide;
各面は価格ポイントで構成され、各ポイントには注文のリストがあります。
私のバイサイドが正常に動作します。
これは私の売り側です。私はこれが降順に命じられることを望む。 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
これは私がリストに要素を追加する方法です。 price
はlong
です。
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);
}
私はそれが唯一の問題だかどうかわからないんだけど、あなたの 'compare'方法は'コンパレータの契約に違反します'インタフェース。 – Eran
@エラン:どうか教えてください。 –
注文の要素を何に追加しますか?リストに?もしそうなら: '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