为什么我的冒泡排序不起作用?- Java

3

我正在尝试按照对象的变量"name"对一个对象arraylist进行字母排序。下面是我编写的代码:

public void sortName()
    {
        int j;

        for ( j = 0;  j < theBatters.size()-1;  j++)
        {
            System.out.println(theBatters.get(j).getName().compareToIgnoreCase(theBatters.get(j+1).getName()));
            if ( theBatters.get(j).getName().compareToIgnoreCase(theBatters.get(j).getName()) > 0 )
            {                                             // ascending sort
                Collections.swap(theBatters, j, j+1);
                j=0;
            } 
        } 
    }

我相信问题与使用swap的那一行有关,因为当我在使用sortName()方法后打印出arraylist后,尽管这行返回了大于0的值,但所有元素仍然是按照原来的顺序排列的:
System.out.println(theBatters.get(j).getName().compareToIgnoreCase(theBatters.get(j+1).getName()));

在你的if语句中,为什么要再次将get(j)与get(j)进行比较? - Andrew the Programmer
2
@AndrewtheProgrammer 找到了这个 bug。你需要在 compareToIgnoreCase 方法的 if 语句中加入 theBatter.get(j+1) - Eli Sadoff
很高兴我能帮到你,我知道像这样的简单错误只凭肉眼查找是很痛苦的。 - Andrew the Programmer
扇脸 太蠢了哈哈,谢谢大家。 - Dylan
缺乏更改是因为您正在比较同一对象的名称。在打印比较结果时,您使用了“get(j)”和“get(j + 1)”,但在您的“if”中,您两次使用了“get(j)”。您可能会遇到的另一个问题是,在迭代结束时,将“j”设置为“0”。但是,每次迭代后,“j ++”都将被执行,因此在下一次迭代开始时,您的“j”将变为“1”。请考虑这一点。 - Pshemo
1个回答

0

冒泡排序的名称意味着有已排序和未排序项目的气泡。你只是忘记了这个事实。这里是可行的(我希望)代码:

    public void sortName()
        {

            for ( int i = 0;  i < theBatters.size()-1;  i++) // bigger outer bubble
            for ( int j = i+1;  j < theBatters.size()-1;  j++) // smaller inner bubble
            {                   System.out.println(theBatters.get(i).getName().compareToIgnoreCase(theBatters.get(j).getName()));
                if ( theBatters.get(i).getName().compareToIgnoreCase(theBatters.get(j).getName()) > 0 )
                {                                             // ascending sort
                    Collections.swap(theBatters, i, j);
                    // j=0; // Not necessary and confusing. It is already in good order
                } 
            } 
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接