0

我整天都在这,在这一点上有点沮丧。我看过几个关于数组的视频,阅读我的文本等。但是,我对我的程序的几个问题感到困惑。我正在开发一个程序,它将生成 1000 个随机整数,将这些整数存储在一个数组中并计算生成的随机整数的频率。我的 IDE 中没有显示任何错误,但是,当它被编译时,我得到一个超出范围的错误。

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at randomintegers.RandomIntegers.calcFrequency(RandomIntegers.java:32)
at randomintegers.RandomIntegers.main(RandomIntegers.java:23)

Java 结果:1 构建成功(总时间:0 秒)

到目前为止,这是我的代码:

        public static void main(String[] args) {

    int randomNumbers[] = new int [1000];
    int i;
    for (i=0;i<1000;i++){
    randomNumbers[i] = 1 + (int)(Math.random() * 10);
    calcFrequency(randomNumbers);
    }
}


public static void calcFrequency(int[] inputArray){
    int freq[]=new int[10];
    int i;
    for (i=0;i<inputArray.length;i++){
        ++freq[inputArray[i]-1];    
    }
    System.out.println("number/tfrequncy");
    System.out.println(freq);
}
4

4 回答 4

0

好的,有几件事:

1)当你迭代一个数组时,使用数组的长度作为条件:

for( int i = 0; i < array.length; ++i )

而不是

for( int i = 0; i < someArbitraryNumberThatYoullHaveToUpdateLaterIfYouChangeTheArray; ++i )

2)您正在生成随机数[1, 10][0, 9] 并将它们加 1 以获得 [1, 10] 的范围,然后使用它们calcFrequency来索引具有元素 [0, 9] 的数组。这将超出阵列的高端。你试图通过减去 1 来解决这个问题,但是当你得到 0 时会发生什么?

3)与其尝试调整数组中的数字,不如在打印出来时简单地增加它们。

System.out.println( (randoms[i] + 1) + " occured " + counts[i] + " times" );
于 2013-10-12T22:57:28.670 回答
0
for (i=0;i<1000;i++){
  randomNumbers[i] = 1 + (int)(Math.random() * 10);
  calcFrequency(randomNumbers);
}

将上面的代码更改为:

for (i=0;i<1000;i++){
  randomNumbers[i] = 1 + (int)(Math.random() * 10);
}
calcFrequency(randomNumbers);

您应该首先初始化数组的每个元素,然后计算频率。否则,所有未初始化的元素都有一个默认值0

以下行是异常的原因:

++freq[inputArray[i]-1];

当当前元素具有默认值0时,此行变为:

++freq[-1];

这给了你java.lang.ArrayIndexOutOfBoundsException: -1

顺便说一句,如果您想打印数组,以下内容将不起作用:

System.out.println(freq);

相反,您可能想要这样做:

System.out.println(Arrays.toString(freq));
于 2013-10-12T22:59:13.903 回答
0

calcFrequency从填充数组的 for 循环内部调用:

for (i=0;i<1000;i++){
    randomNumbers[i] = 1 + (int)(Math.random() * 10);
    // The first iteration of this loop has only put one value in random numbers
    // So the following will be a mostly empty array:
    calcFrequency(randomNumbers);
}

int 的空数组都设置为零,因此当 freq[inputArray[i]-1] 的时间到来时,i 为 1 将导致 freq[0-1] 或您看到的 -1 索引错误。

相反,一旦你完成了数组,你会想要 calcFrequency :

for (i=0;i<1000;i++){
    randomNumbers[i] = 1 + (int)(Math.random() * 10);
}
calcFrequency(randomNumbers);
于 2013-10-12T22:51:15.660 回答
0

首先,为什么将 calcFrequency 放在 for 循环中。它会在程序放入足够的随机数之前到达。

由于数组没有被填充,calcFrequency 函数找不到你想要的对象,这会产生错误

于 2013-10-12T22:53:26.440 回答