Сортировка массива списка объектов на основе атрибутов объекта - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть список, который содержит объект класса свойств, В списке у меня есть 3 статуса

  • not_paid
  • платный
  • part_paid

Я хочу отсортировать список ниже по порядку.

Первый - not_paid second- 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;
    }
};

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Что вы можете сделать, это сначала отобразить строки в целые числа в нужном порядке, а затем просто вычесть их из друг друга.

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 для определения фиксированного набора известных значений, таких как статусы платежей. Это обеспечивает безопасность во время компиляции.

Примечание. Однако я бы не предлагал связывать порядок объявления enum с порядком сортировки.

0 голосов
/ 06 сентября 2018

Чтобы избежать сложного компаратора, я советую вам экспортировать ваши статусы в 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())); 
...