我在高中读了一门计算机科学课,今天我们在选拔课上学到了一课。我写了一个程序(它可能很笨拙,但请耐心等待我,我正在学习)并且它的工作原因在于它排序,但有时它会抛出一个ArrayIndexOutOfBoundsException。只是有时。我不知道这是怎么可能的,因为我在整个程序中处理相同的数组,并且数组具有固定的长度。如果有人有一些见解,那将非常有帮助。
我认为该错误与int first = y[movedVariable];
有关。但是,我不明白moveVariable是如何出界的,因为我很确定我编写了我的程序,以便它可以<数组的长度。
public class selectionSort
{
public static int[] array;
public static int movedVariable = 0;
public static void main()
{
array = new int[10];
int x;
for (int count = 0; count < array.length; count++)
{
if (count == 0)
{
x = (int)(Math.random()*100+2);
array[count] = x;
}
else
{
x = (int)(Math.random()*100+2);
for (int y = 0; y < count; y++)
{
while(x == array[y])
{
x = (int)(Math.random()*100+2);
}
}
array[count] = x;
}
}
sort(array);
}
public static void sort(int[] x)
{
int thing = 0;
for(int hello = 0; hello < x.length; hello++)
{
int part = x[thing];
for ( int count = thing; count < x.length-1; count++)
{
if( part > x[count+1] )
{
part = x[count+1];
}
}
thing++;
swap( x, part);
}
int f = 0;
String output = "";
for( int val : x )
{
if (f%10 == 0)
{output += "\n";}
output += val + " ";
f++;
}
System.out.print(output);
}
public static int[] swap(int [] y, int num)
{
int count = 0;
int index = 0;
for ( count = 0; count < y.length; count++)
{
if (y[count] == num)
{index = count;}
}
int first = y[movedVariable];
y[movedVariable] = y[index];
y[index] = first;
movedVariable++;
return y;
}
}
答案 0 :(得分:0)
为了好玩,我运行了你的代码1,000,000次迭代并且没有超出范围的异常,除非我没有在每次迭代之前将static movingVariable清除为0。
由于在前10次调用swap()之后,movingVariable是静态的,因此它将是10,如果进行另一次调用交换,你将获得超出范围的索引。但是,只有在每次运行多次调用sort()时才会发生这种情况。仅对需要在类的实例之间保留的值使用static。属于您的实例状态的非静态。其他一切的局部变量。否则你正在创建一个等待发生的漏洞。
我重构了你的类以删除具有相同功能的变量。例如,你的东西和你的movingVariable以及sort()中的hello变量只能是一个变量。尽量消除做同样事情的多个变量,比如瘟疫。它是非明显错误的来源。
另外,您将数组中的值传递给swap然后在数组中查找它以获取索引,这是浪费时间。只需传入索引即可进行交换。当您在两个不同的位置具有相同的值时,它还会为您的排序功能带来问题。交换将使用它找到的最后一个。 sort()应该处理数组中的重复值。这就解释了为什么用唯一值初始化数组。你不应该这样做。实际上,您应该使用明确添加的重复项来测试您的代码,以确保您的功能正常工作。
我将数组的打印移出了自己的方法。它对于在中间步骤进行调试非常有用,而不仅仅是在完成排序时。
我试着保持变量名相同且逻辑不变,以便您可以按照更改进行操作。
public class Main
{
public static void sort(int[] x)
{
for (int movedVariable = 0; movedVariable < x.length; movedVariable++)
{
int part = x[movedVariable];
int index = movedVariable;
for (int count = movedVariable; count < x.length - 1; count++)
{
if (part > x[count + 1])
{
part = x[count + 1];
index = count + 1;
}
}
swap(x, index, movedVariable);
}
printArray(x);
}
private static void printArray(int[] x)
{
int f = 0;
String output = "";
for (int val : x)
{
if (f % 10 == 0)
{
output += "\n";
}
output += val + " ";
f++;
}
System.out.print(output);
}
public static int[] swap(int[] y, int index, int movedVariable)
{
int first = y[movedVariable];
y[movedVariable] = y[index];
y[index] = first;
return y;
}
public static void main(String[] args)
{
int[] array = new int[10];
int x = 0;
for (int count = 0; count < array.length; count++)
{
for (int y = count; --y >= 0; )
{
do
{
x = (int) (Math.random() * 100 + 2);
}
while (x == array[y]);
}
array[count] = x;
}
printArray(array);
sort(array);
}
}