根据对象属性对对象数组列表进行排序
Sort Array list of objects based on object attributes
我有一个包含 属性 class 对象的列表,在列表中我有 3 个状态
- not_paid
- 付费
- part_paid
我想按照上述顺序对列表进行排序。
第一 - not_paid
第二- part_paid
第三次支付
如何使用 Comparator
class.?
对我的列表进行排序
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;
}
};
这是我的代码。我使用此代码低于订单。
付费-->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;
}
};
为了避免复杂的比较器,我鼓励您将状态导出到 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()));
您可以做的是首先将字符串按所需顺序映射为整数,然后简单地将它们彼此相减。
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
s 来定义一组固定的已知值,例如付款状态。这提供了编译时安全性。
注意:但是,我不建议将枚举声明顺序绑定到排序顺序。
我有一个包含 属性 class 对象的列表,在列表中我有 3 个状态
- not_paid
- 付费
- part_paid
我想按照上述顺序对列表进行排序。
第一 - not_paid 第二- part_paid 第三次支付
如何使用 Comparator
class.?
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;
}
};
这是我的代码。我使用此代码低于订单。
付费-->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;
}
};
为了避免复杂的比较器,我鼓励您将状态导出到 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()));
您可以做的是首先将字符串按所需顺序映射为整数,然后简单地将它们彼此相减。
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
s 来定义一组固定的已知值,例如付款状态。这提供了编译时安全性。
注意:但是,我不建议将枚举声明顺序绑定到排序顺序。