我正在實施示例訂單簿(在Exchange域中),我正在使用Java中的PriorityQueue實現購買和銷售方面。
PriorityQueue是Java不按順序降序與自定義比較器
買方應該是降序和賣方應該是升序。
PriorityQueue<ArrayList<Order>> bookSide;
每邊都包含價格點,每個點都有一個訂單列表。
我的購買方工作正常。
這是我的賣方。我想這是要降序。
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
當101被加入,它正確添加101低於100(100列表)。但是當我添加99時,它會破壞訂單併成爲99,101,100。
我不知道什麼是錯的。
請幫我一把。
編輯
這是我如何將這些元素添加到列表中。 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
@Eran:請告訴我如何。 –
您將訂單的元素添加到什麼?到名單上?如果是這樣的話:當您更改包含的ArrayList時,'PriorityQueue'不會奇蹟般地重新排序,它假定爲常量元素。備註:如果'arg0.size()== arg1.size()== 0',則返回'-1'而不是'0'。 ['Comparator.compare()'](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-TT-)只允許返回'-1' ,'0'和'1'。 – dhke