基于对象属性对对象列表排序

dev*_*g99 3 java sorting arraylist comparator

我有包含属性类对象的列表,在列表中我有3个状态

  • 没有支付
  • 支付
  • part_paid

我想按下面提到的顺序对我的列表进行排序.

首先 - not_paid second-part_paid third -paid

如何使用Comparator类对列表进行排序.

public static Comparator<OrderHistoryItemData> COMPARE_BY_PAYMENT = new Comparator<OrderHistoryItemData>() {
    public int compare(OrderHistoryItemData one, OrderHistoryItemData other) {
        String p1 = one.getAttributes().getFieldPaymentStatus();
        String p2 = other.getAttributes().getFieldPaymentStatus();
        if (p1.equals(p2)) {
            return 0;
        }
        if (p1.equals("not_paid") && (p2.equals("part_paid") || p2.equals("not_paid"))) {
            return -1;
        }
        if (p1.equals("not_paid") && p2.equals("not_paid")) {
            return -1;
        }
        return 1;
    }
};
Run Code Online (Sandbox Code Playgroud)

这是我的代码.我使用此代码获得低于订单.

支付 - > not_paid - > part_paid

这是我的更新代码.我得到了我的结果.

public static Comparator<OrderHistoryItemData> COMPARE_BY_PAYMENT = new Comparator<OrderHistoryItemData>() {
    public int compare(OrderHistoryItemData one, OrderHistoryItemData other) {
        String p1 = one.getAttributes().getFieldPaymentStatus();
        String p2 = other.getAttributes().getFieldPaymentStatus();
        if (p1.equals(p2)) {
            return 0;
        }
        if (p1.equals("not_paid") && (p2.equals("part_paid") || p2.equals("paid"))) {
            return -1;
        }
        if (p1.equals("part_paid") && p2.equals("paid")) {
            return -1;
        }
        return 1;
    }
};
Run Code Online (Sandbox Code Playgroud)

Sch*_*uca 6

为避免复杂的比较,我鼓励您将状态导出到enum.(如果您将来添加更多状态,而不需要更改比较器中的逻辑),这将起作用:

enum PaymentStatus { // Write them in order you want to be sorted
    NOT_PAID,
    PART_PAID,
    PAID
}
Run Code Online (Sandbox Code Playgroud)

然后排序将如下所示:

list.sort(Comparator.comparing(item ->item.getAttributes().getFieldPaymentStatus())); 
Run Code Online (Sandbox Code Playgroud)