根据对象属性对对象的数组列表进行排序

时间:2018-09-06 10:53:43

标签: java sorting arraylist comparator

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

  • 未付款
  • 已付费
  • part_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;
    }
};

这是我的代码。我正在使用此代码低于订单。

已付款->未付款->部分已付款

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

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;
    }
};

2 个答案:

答案 0 :(得分:6)

为避免复杂的比较器,我建议您将状态导出到enum。 (此外,如果将来您将添加更多状态,而无需更改比较器中的逻辑,则此方法将起作用):

enum PaymentStatus { // Write them in order you want to be sorted
    NOT_PAID,
    PART_PAID,
    PAID
}

然后排序将很简单:

list.sort(Comparator.comparing(item ->item.getAttributes().getFieldPaymentStatus())); 

答案 1 :(得分:4)

您可以做的是首先将字符串按所需顺序映射到整数,然后简单地将它们彼此减去。

private static Comparator<Payments> comparator = new Comparator<Payments>() {

    // Use this mapping function to map the statuses to ints.
    // The lowest number comes first
    private int map(String str) {
        switch (str) {
            case "not_paid":
                return 0;
            case "part_paid":
                return 1;
            case "paid":
                return 2;
            default:
                return 3;
        }
    }
    // Alternatively, you can use the Map interface to define the sorting
    // order.

    @Override
    public int compare(Payments o1, Payments o2) {
        return map(o1.status) - map(o2.status);
    }
};

我建议– Schidu Luca已经提到它in his answer –您使用enum来定义一组固定的已知值,例如付款状态。这样可以提供编译时安全性。

注意:但是,我不建议将枚举声明顺序绑定到排序顺序。