我有一个包含属性类对象的列表,在列表中我有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;
}
};
答案 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
来定义一组固定的已知值,例如付款状态。这样可以提供编译时安全性。
注意:但是,我不建议将枚举声明顺序绑定到排序顺序。