Java 按具有优先级的 3 个字段对对象的 ArrayList 进行排序,得到意想不到的结果
Java sorting an ArrayList of objects by 3 fields with priorities, getting unexpected results
我有一个 class 订单(我剪掉了较小尺寸的 setter 和 getter)。
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;
}
}
我有一份订单清单:
public static ArrayList<Order> buyOrders = new ArrayList<Order>();
我愿意
Collections.sort(buyOrders);
排序时我想使用什么规则:
- 带有 isMarketOrder == true 的订单总是最先出现
- 具有相同 isMarketOrder 值的订单按价格排序,较高的在前
- 具有相同 isMarketOrder 和价格的订单按 "number" 排序,较小的在前。
实际情况是价格较高的商品排在第一位,isMarketOrder == true
商品排在最后。
这是为什么?
因为 true
大于 false
,所以您使用的排序 isMarketOrder==false
排在 isMarkerOrder==true
之前。如果你有:
int value1 = Boolean.compare(this.isMarketOrder(), o.isMarketOrder());
if (value1 != 0){
return -value1;
}
你会得到相反的效果。
我有一个 class 订单(我剪掉了较小尺寸的 setter 和 getter)。
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;
}
}
我有一份订单清单:
public static ArrayList<Order> buyOrders = new ArrayList<Order>();
我愿意
Collections.sort(buyOrders);
排序时我想使用什么规则:
- 带有 isMarketOrder == true 的订单总是最先出现
- 具有相同 isMarketOrder 值的订单按价格排序,较高的在前
- 具有相同 isMarketOrder 和价格的订单按 "number" 排序,较小的在前。
实际情况是价格较高的商品排在第一位,isMarketOrder == true
商品排在最后。
这是为什么?
因为 true
大于 false
,所以您使用的排序 isMarketOrder==false
排在 isMarkerOrder==true
之前。如果你有:
int value1 = Boolean.compare(this.isMarketOrder(), o.isMarketOrder());
if (value1 != 0){
return -value1;
}
你会得到相反的效果。