数组访问时出现 ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException on array access

下午好!我必须创建 2 个数组。第一个应该创建一个随机数 (-10;10) 如果用户写 0,否则它应该使用输入的公式计算;第二个数组应该首先写入 array1 中的元素,这些元素具有不均匀的 个位置 ,然后是偶数个位置。所以基本上在 array2 0-10 位置为奇数,然后 11-19 位置为偶数。 但不幸的是,当我 "run" 程序第二个数组出现错误时:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 20 out of bounds for length 20).

int K;  
System.out.print("K=");
if (sc.hasNextInt())
    K=sc.nextInt();
else {
    System.out.println("Error (is not an integer)");
    sc.close();
    return;
}

double A[]=new double [20];
double B[]=new double [20];

System.out.println ("result:");
System.out.println ("A: ");
if (K==0) {
    Random r=new Random();
    for (int i=0; i<20;i++) {
        A[i]=-10+20*r.nextDouble();
    }
}
if (K!=0) {
    A[0]=1;
    for (int i=1;i<20;i++) { 
        double a=Math.sin(A[i-1])*K; 
        A[i] = Math.round(a * 100.0) / 100.0;
    }
}

int i=0;
while (i<20) { 
    System.out.printf("%.2f", A[i]); System.out.print(" ");
    if (i==9) System.out.println();
    i++;
}

System.out.println ();
System.out.println ("B: ");
int even=11, uneven=0, p=0;
do { 
    int z=p;
    if (z%2==0) {
        B[even]=A[p];
        even++;
    }
    if (z%2!=0) {
        B[uneven]=A[p];
        uneven++;
    }
    p++;
} while (p<20);

for (int k=0; k<20;k++) { 
    System.out.printf ("%.2f",B[k]); System.out.print(" ");
    if (k==9) System.out.println();
}

在 do-while 循环中:

p=0 -> p is even, 'even' get incremented and become 12.
p=2 -> p is even, 'even' get incremented and become 13.
...
p=14 -> p is even, 'even' get incremented and become 19.
p=16 -> p is even, 'even' get incremented and become 20. <- game over!

有简单的解决方法吗?

将所有小于 20 的整数除以 2,得到:

0/2 = 0
1/2 = 0
2/2 = 1
3/2 = 1
4/2 = 2
...
18/2 = 9
19/2 = 9

你看到规律了吗?

新索引应该是10+(p/2)偶数pp/2奇数p

    do { 
        if (p%2==0) { //p is even
            B[10+(p/2)]=A[p];
        }
        if (p%2!=0) { //p is odd
            B[(p/2)]=A[p];
        }
        p++;
    } while (p<20);

做如下修改,你的代码会很好运行,

double B[ ] = new double[ 21 ];

do
      {
         int z = p;
         if (z % 2 == 0)
         {
            B[even] = A[p];
            even++;
         }
         else
         {
            B[uneven] = A[p];
            uneven++;
         }
         p++;
      }
      while (p < 19);

注意while里面的条件。

对了,循环里面不需要引入z,没用的,把if条件中的z换成p就可以了

if (p % 2 == 0)