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()); } }
Advertisement
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)
.