Java使用优先级对3个字段对象的ArrayList进行排序,从而获得意外结果

Eup*_*phe 1 java sorting arraylist

我有一个班级订单(我减少了较小尺寸的制定者和吸气剂).

class Order implements Comparable<Order>{
    private int number;
    private int price;
    private int quantity;
    private boolean isMarketOrder;
    private boolean isBuyOrder;

    @Override
    public int compareTo(Order o) {
        int value1 = Boolean.compare(this.isMarketOrder(), o.isMarketOrder());
        if (value1 != 0){
            return value1;
        }
        int value2 = Integer.compare(this.getPrice(),(o.getPrice()));
        if (value2 != 0) {
            return value2;
        }
        int value3 =  Integer.compare(this.getNumber(),(o.getNumber()));
        return value3;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一份订单清单:

public static ArrayList<Order> buyOrders = new ArrayList<Order>();
Run Code Online (Sandbox Code Playgroud)

我做

Collections.sort(buyOrders);
Run Code Online (Sandbox Code Playgroud)

排序时我想要使用的规则:

  1. 订单使用isMarketOrder == true总是先来
  2. 具有相同isMarketOrder值的订单按价格排序,先排序更高
  3. 具有相同的订单isMarketOrder和价格按"数字"排序,先小一些.

实际发生的事情是价格较高的商品首先出现,isMarketOrder == true商品是最后的.

这是为什么?

khe*_*ood 5

因为true大于false,所以您使用的排序isMarketOrder==false要先去isMarkerOrder==true.如果你有:

int value1 = Boolean.compare(this.isMarketOrder(), o.isMarketOrder());
if (value1 != 0){
    return -value1;
}
Run Code Online (Sandbox Code Playgroud)

你会得到相反的效果.