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

3

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

  • 未付款
  • 已付款
  • 部分付款

我想按照以下顺序排序我的列表。

第一 - 未付款 第二 - 部分付款 第三 - 已付款

如何使用 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;
    }
};

请在您的问题中添加一些数据和代码。 - Tim Biegeleisen
你忘记添加你的代码了吗? - soorapadman
2个回答

6
为避免复杂的比较器,我建议您将状态导出到一个枚举中。(如果您将来添加更多状态,这也将起作用,而无需更改比较器中的逻辑):
enum PaymentStatus { // Write them in order you want to be sorted
    NOT_PAID,
    PART_PAID,
    PAID
}

那么排序将变得非常简单:
list.sort(Comparator.comparing(item ->item.getAttributes().getFieldPaymentStatus())); 

我正在尝试使用你的代码,但是我需要在哪里传递“PaymentStatus”?以下是我的代码:Collections.sort(list, Comparator.comparing((OrderHistoryItemData orderListResult) -> orderListResult.getAttributes().getFieldPaymentStatus())); - tech.mohit.garg
这只是一个“枚举”,您可以为此创建一个单独的文件。 - Schidu Luca
在“OrderHistoryItemData”中,您必须用创建的“枚举”字段替换您的“String”字段。 - Schidu Luca

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已经在他的回答中提到 - 你可以使用enum来定义一组已知的固定值,例如支付状态。这提供了编译时的安全性。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接