为什么程序没有对数组进行排序?
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 = 4
、i + 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);
我正在编写一个程序,通过将最大值移动到末尾来排列数组,但由于某种原因,该程序没有按菜单排列值。 我该如何解决?
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 = 4
、i + 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);