为什么程序没有对数组进行排序?

Why is the program not ordering the array?

我正在编写一个程序,通过将最大值移动到末尾来排列数组,但由于某种原因,该程序没有按菜单排列值。 我该如何解决?

public static void main(String args[]) {
    ArrayList<Integer> list = new ArrayList<>(); 
    list.add(15); 
    list.add(78); 
    list.add(44); 
    list.add(99); 
    list.add(32);
    
    int num = 1;
    for(int i = 0; i<=list.size() -1;){
        if(list.get(i) > list.get(i+1)){
            list.add(list.get(i));
            list.remove(i);
            System.out.println(list);
        }
        else{
            i+=1;
            num+=1;
        }
    }
}

这是我得到的:

[15, 44, 99, 32, 78]
[15, 44, 32, 78, 99]

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 5 out of bounds for length 5
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:458)
    at MyClass.main(MyClass.java:10)

下面的代码是 IndexOutOfBoundsException 的原因。当 i = 4i + 1 = 5 且列表中没有索引匹配时。

    if(list.get(i) > list.get(i+1)){

如果你想试试bubble sort你可以试试下面的

 for (int i = list.size() - 1; i >= 0; i--)
        for (int j = 0; j < i; j++) {
            if (list.get(j) > list.get(j + 1)) {
                int temp = list.get(j);
                list.set(j, list.get(j + 1));
                list.set(j + 1, temp);
            }
        }
 System.out.println(list);

如果您打算在没有自己的代码的情况下进行排序,您可以使用

    Collections.sort(list);

这个有效:

public static void main(String args[]) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(15); 
        list.add(78); 
        list.add(44); 
        list.add(99); 
        list.add(32);
    
        for(int i = 0; i < list.size() - 1; i++){
            for(int j = 0; j < list.size() - i - 1; j++){
                if(list.get(j) > list.get(j + 1)){
                    int temp = list.get(j);
                    list.set(j, list.get(j + 1));
                    list.set(j + 1, temp);
                }
            }
        }
        System.out.println(list);
    }

首先,在遍历列表时将 and/or 删除项添加到列表通常不是一个好主意。你很幸运它在这里工作,因为你添加和删除相同数量的项目,但最好交换 i 和最后位置的项目:

int last = list.get(list.size() - 1);
list.set(list.size() - 1) = list.get(i);
list.set(i) = last;

但是对于你的问题:循环的索引 (i) 从 0 到 4。在最后一个循环中,当你尝试 list.get(i+1) 时,你试图获得索引 4+1 = 5,但列表只有 5 个大小,因此没有索引 5.

在你的情况下,你只需要循环到倒数第二个索引,而不是最后一个:

for(int i = 0; i<=list.size() - 2;){
//       Change from 1 to 2 ----^

如果您想手动排序,则此代码有效:

while  ( i < list.size()-1) {
        if(list.get(i) > list.get(i+1)){
            list.add(list.get(i));
            list.remove(i);
            i--;
        } else {
            i++;
        }
        
    }

但为了提高效率,我建议您使用:

Collections.sort(list);