首页 > 解决方案 > Java 冒泡排序字符串 ArrayList 对象

问题描述

有人可以找到为什么这没有被排序我似乎无法找到我有什么问题吗?正在显示的输出是我如何依次输入它们,因此排序方法不起作用......

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

标签: javastringobjectarraylist

解决方案


存在三个错误:
1. 它i++代替i+1. i++意思是:返回i然后增加它的值。所以t1t2是相同的元素。
2. 它运行列表的完整扫描,同时它应该停止tList.size()-1以避免IndexOutOfBoundsException。
3. 这不是真正的冒泡排序。你需要两个循环。

此外,您从不使用valid,因此应将其删除。如果列表已经排序,我将其替换为 true 的标志。

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

最后,如果您使用泛型,您可以将 tList 声明为List<Ticket> tList. 这样您就不需要强制转换由list.get(index).


推荐阅读