Java Bubble Sort String ArrayList Object

Tags: , , ,



Can someone find why this isn’t being sorted I can’t seem to find what I have wrong? The output that is being displayed is how I input them after each other thus the sort method isn’t working…

// Sorting Ticket by Alphabetic Order - Method
public void SortTicket() {
    boolean valid = true;

    for (int i = 0; i < tList.size(); i++) {
        valid = false;
        Ticket t1 = (Ticket) tList.get(i);
        Ticket t2 = (Ticket) tList.get(i++);

        if (t1.GetSurname().compareTo(t2.GetSurname()) > 0) {
            tList.remove(t1);
            tList.add(i++, t1);
            valid = true;
        }

    }

    for (int i = 0; i < tList.size(); i++) {
        Ticket tmpTick = (Ticket) tList.get(i);
        System.out.println(tmpTick.ToString());
    }
}

Answer

There are three errors:
1. It does i++ instead of i+1. i++ means: return i then increment its value. So t1 and t2 are the same element.
2. It runs a full scan of the list, while it should stop at tList.size()-1 to avoid an IndexOutOfBoundsException.
3. It isn’t a real bubble sort. You need two loop.

Moreover you never use valid, so it should be removed. I replaced it with a flag that is true if the list is already sorted.

public void SortTicket()
{
    int size = tList.size();
    int end = size-1; // size-1, so you don't get an IndexOutOfBoundsException
    boolean sorted = false;
    for(int i = 0; i < size-1 && !sorted; i++) 
    {
        sorted = true; // if you never execute a swap, the list is already sorted
        for (int j=0; j<end; j++) {
            Ticket t1 = (Ticket) tList.get(j);
            Ticket t2 = (Ticket) tList.get(j+1); // j+1, so you don't change the value of i
            if(t1.GetSurname().compareTo(t2.GetSurname()) > 0)
            { 
                sorted = false;
                tList.remove(j);
                tList.add(j+1, t1); // j+1, so you don't change the value of i
            }
        }
        end--;
    }

    for(int i = 0; i<size; i++)
    {
        Ticket tmpTick = (Ticket) tList.get(i);
        System.out.println(tmpTick.ToString());
    }
}

Lastly, if you’re using generics, you could declare tList as List<Ticket> tList. This way you don’t need to cast the object returned by list.get(index).



Source: stackoverflow