Java Object Comparable с использованием многих атрибутов - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть несколько заказов для загрузки и выгрузки в маршрутах доставки, одному маршруту может быть присвоен один OrderDocument для загрузки, выгрузки или обоих. Каждый заказ-документ упорядочен по индексу в назначенном маршруте. Итак, класс выглядит так:

class OrderDocument implements Comparable<ModelTask>{
    int order_id;  // The document ID
    int route_load_id;  // The route this order is assigned to be loaded
    int route_unload_id;  // The route this order is assigned to be loaded, may be same as route_load_id and viceversa
    int route_load_index;  // The index order in load route
    int route_unload_index;  // The index order in unload route
}

Тогда у меня есть класс Route:

class Route{
    int id; // ID of route, this value should be in OrderDocument.route_load/unload_id
    ArrayList<OrderDocument> orders;  // **I WANT TO SORT THIS LIST**
   ...

Итак, у меня есть функция, которая создает экземпляр Route и добавляет объекты OrderDocument в его orders ArrayList, поэтому список должен содержать документы, которые Route.id находятся в route_load_id или в route_unload_id

Основная проблема

Мне нужно, чтобы этот список сортировался по индексу загрузки / выгрузки, если идентификатор маршрута указан в load_id или unload_id. На самом деле у меня есть следующий Comparator подход, но он не работает.

private class OrdersComparable implements Comparator<OrderDocument>{
    @Override
    public int compare(OrderDocument x, OrderDocument y) {
        if (x.route_load_id == y.route_load_id)
            return x.route_load_index - y.route_load_index;
        else if (x.route_load_id == y.route_unload_id)
            return x.route_load_index - y.route_unload_index;
        else if (x.route_unload_id == y.route_load_id)
            return x.route_unload_index - y.route_load_index;
        else if (x.route_unload_id == y.route_unload_id)
            return x.route_unload_index - y.route_unload_index;
        else
            return 0;
    }
}
* ** 1 022 тысяча двадцать-один * Пример

4 Заказа в Трассе-43, 2 для загрузки, 4 для выгрузки.

OrderDocument('order_id':1, 'route_load_id':43, 'route_unload_id':null, 'route_load_index':0, 'route_unload_index':null)
OrderDocument('order_id':2, 'route_load_id':43, 'route_unload_id':null, 'route_load_index':2, 'route_unload_index':null)
OrderDocument('order_id':3, 'route_load_id':null, 'route_unload_id':43, 'route_load_index':null, 'route_unload_index':1)
OrderDocument('order_id':1, 'route_load_id':null, 'route_unload_id':43, 'route_load_index':null, 'route_unload_index':3)

Фактический заказ по order_id: 1, 2, 3, 1

Требуется заказ по order_id: 1, 3, 2, 1

1 Ответ

0 голосов
/ 09 ноября 2018

Если вы используете значения null (и соответствующие типы, допускающие значение NULL), вы должны проверить, что ваши условия не сравнивают нули, в противном случае будет выполняться нежелательное условие:

class OrderDocument implements Comparable<ModelTask> {
    int order_id;  // The document ID
    Integer route_load_id;  // The route this order is assigned to be loaded
    Integer route_unload_id;  // The route this order is assigned to be loaded, may be same as route_load_id and viceversa
    Integer route_load_index;  // The index order in load route
    Integer route_unload_index;  // The index order in unload route
}

class OrdersComparable implements Comparator<OrderDocument> {
@Override
public int compare(OrderDocument x, OrderDocument y) {
    if (x.route_load_id == y.route_load_id && x.route_load_id != null)
        return Integer.compare(x.route_load_index, y.route_load_index);

    if (x.route_load_id == y.route_unload_id && x.route_load_id != null)
        return Integer.compare(x.route_load_index, y.route_unload_index);

    if (x.route_unload_id == y.route_load_id && x.route_unload_id != null)
        return Integer.compare(x.route_unload_index, y.route_load_index);

    if (x.route_unload_id == y.route_unload_id && x.route_unload_id != null)
        return Integer.compare(x.route_unload_index, y.route_unload_index);

    return 0;
}
}
...