Deckkee Qamar
Deckkee Qamar

Reputation: 105

Android II JAVA Sorting An ArrayList of an object

First of all sorry if my English bad, its not my first language..

I'm working on and android app project, that needed to sort ArrayList of an object..so I made this method to deal with that...

Lets say that I have an object of Restaurant that will contain this data:

private String name;
private float distance ;

And I sort it using the value of the variable distance from lowest to highest:

public void sort(RArrayList<RestaurantData> datas) {
    RestaurantData tmp = new RestaurantData();
    int swapped;
    boolean b = true;
    while (b) {
        swapped = 0;
        for (int i = 0; i < datas.size()-1; i++) {
            if (datas.get(i).getDistance() > datas.get(i+1).getDistance()) {
                tmp = datas.get(i);
                datas.set(i, datas.get(i+1));
                datas.set(i+1, tmp);
                swapped = 1;
                System.err.println("Swapped happening");
            }
        }   
        if (swapped == 0) {
            System.err.println("Swapped end");
            break;
        }

    }

But when i try the program..the result of an ArrayList is still random, is there any problem with my logic to sort the ArrayList of an object.. Please Help...Thankyou..

Upvotes: 3

Views: 87

Answers (1)

Fred
Fred

Reputation: 17095

Why not use the Collections.sort method?

Here's how you could do it in your project:

public void sort(RArrayList<RestaurantData> datas) {
  Collections.sort(datas, new Comparator<RestaurantData>() {
        @Override
        public int compare(RestaurantData lhs, RestaurantData rhs) {
            return lhs.getDistance() - rhs.getDistance();
        }
    });
}

The above solution is a bit "destructive" in the sense that it changes the order of the elements in the original array - datas. If that's fine for you go ahead and use it. Personally I prefer things less destructive and if you have the memory to spare (meaning your array is small) you could consider this solution which copies the array before sorting. It also assumes your RArrayList is an implementation of ArrayList or backed up by it:

public List<RestaurantData> sort(RArrayList<RestaurantData> datas) {
  // Create a list with enough capacity for all elements
  List<RestaurantData> newList = new RArrayList<RestaurantData>(datas.size());
  Collections.copy(newList, datas);
  Collections.sort(newList, new Comparator<RestaurantData>() {
        @Override
        public int compare(RestaurantData lhs, RestaurantData rhs) {
            return lhs.getDistance() - rhs.getDistance();
        }
    });
  return newList;
}

Another thing to consider is also to create a single instance of the Comparator used in the method, since this implementation will create one instance per call. Not sure if it's worth it though, because it will also be destroyed quite soon since the scope is local.

Here's the documentation for the Collections api

One last thing, the comparator simply needs to return a value less than 0 if the elements are in the right order, bigger than 0 if they're in the wrong order or 0 if they're the same. Therefore it seems to be that it's enough to simply subtract the distances of each restaurant. However, if this isn't the case, please implement the comparator suiting your needs.

Upvotes: 2

Related Questions