Java 为什么程序没有对阵列进行排序?

Java 为什么程序没有对阵列进行排序?,java,arrays,list,integer,Java,Arrays,List,Integer,我正在制作一个程序,通过将最大值移到末尾来排列数组,但由于某些原因,该程序没有按菜单排列值。 我怎样才能解决这个问题 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

我正在制作一个程序,通过将最大值移到末尾来排列数组,但由于某些原因,该程序没有按菜单排列值。 我怎样才能解决这个问题

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

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

    if(list.get(i) > list.get(i+1)){
如果您想尝试
气泡排序
,可以在下面进行尝试

 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);
这项工作:

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);
    }
publicstaticvoidmain(字符串参数[]){
ArrayList=新建ArrayList();
增加(15);
增加(78);
增加(44);
增加(99);
增加(32);
对于(int i=0;ilist.get(j+1)){
int temp=列表获取(j);
list.set(j,list.get(j+1));
列表设置(j+1,温度);
}
}
}
系统输出打印项次(列表);
}

首先,在列表上循环时向列表中添加和/或删除项目通常不是一个好主意。您很幸运它在这里工作,因为您正在添加和删除相同数量的项目,但最好在
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 ----^

for(int i=0;i如果要手动排序,则此代码可以工作:

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

仅使用
list.sort();
如何?您得到了什么输出?您期望得到什么输出?注意:
i这就是我得到的:“[15,44,99,32,78][15,44,32,78,99]线程“main”java.lang.IndexOutOfBoundsException:索引5超出了java.base/jdk.internal.util.Premissions.outOfBounds处长度5的界限在java.base/jdk.internal.util.Premissions.outOfBoundsCheckIndex(Premissions.java:70)在java.base/jdk.internal.util.Premissions.checkIndex(Premissions.java:248)在java.base/java.util.Objects.checkIndex(Objects.java:372)在java.base/java.util.ArrayList.get(ArrayList.java:458)在MyClass.main(MyClass.java:10)上“”您的
i
将上升到列表的最后一个元素,此时
list.get(i+1)
位于列表的末尾,因此它会引发异常。但我希望它进行排序menually@spider你可以看到我的更新。
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);