0

I have some orders to be loaded and unloaded in delivery routes, one route can have one OrderDocument asigned to it to be loaded, unloaded or both. Each order-document is ordered by an index in the route assigned. So the class looks like this:

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
}

Then I have the Route class:

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**
   ...

So, I have a function that create a Route instance and adds OrderDocument objects to its orders ArrayList so the List should have Documents that Route.id is in route_load_id or in route_unload_id

The main problem

I need this list to be sorted by load/unload index if the route id is in load_id or unload_id. Actually I have the following Comparator aproach but is not working.

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;
    }
}

Example

4 Orders in the Route-43, 2 to be loaded, 4 to be unloaded.

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)

Actual order by order_id: 1, 2, 3, 1

Required order by order_id: 1, 3, 2, 1

1 Answer 1

1

If you are using null values (and the nullable corresponding types), you have to check your conditions do not compare nulls, otherwise will satisfy a nondesirable condition:

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;
}
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.