编写一个程序Example.java以计算数据以构造从文件读取的整数值的直方图。直方图是一个条形图,其中每个条形的长度给出了落入某个值范围(通常称为bin)的项目数。您实际上不会绘制条形图,但会打印出每个纸槽的大小。
您的程序应带有四个命令行参数:
array
中的integers
的文件名b
给出要排序的bins
的数量。min
在最小的bin
中给出最小的数字。s
,给出每个bin
中的大小(不同个整数)。您可以假设(无需检查)该b > 0 and s > 0
。将感兴趣的值范围划分为大小为s的b个bin。计算文件中属于每个bin的值的数量。还要计算完全低于或高于范围的值的数量。
例如,给定此测试文件data1:"05X/data1"
1 15
2 18 11 -101 51 92 53 45 55 52 53 54 55 56 5 -2
java Example data1 10 -10 7
的输出应为
x < -10: 1
-10 <= x < -3: 0
-3 <= x < 4: 1
4 <= x < 11: 1
11 <= x < 18: 1
18 <= x < 25: 1
25 <= x < 32: 0
32 <= x < 39: 0
39 <= x < 46: 1
46 <= x < 53: 2
53 <= x < 60: 6
x >= 60: 1
我下面的代码能够打印输出的第一行。 for循环会打印出min <= x 这是什么语法错误?请帮助Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 at Example.main(Example.java:49)
class Example {
public static void main (String argv[]) throws IOException {
if (argv.length != 4)
usage ();
int[] is = {0};
int b = 0;
int min = 0;
int s = 0;
try {
is = readIntArray(argv[0]);
b = Integer.parseInt (argv[1]);
min = Integer.parseInt (argv[2]);
s = Integer.parseInt(argv[3]);
} catch (NumberFormatException e) {
usage();
}
int max = b * s + min;
int [] count = {0};
for (int i = 0; i < is.length; i++)
if (is[i] < min){
count[0]++;
} else if (i >= max) {
count[b+1]++;
} else {
int n = min;
int index = 0;
while (i < n + s){
n += s;
index++;
count[i]++;
}
}
System.out.println("x < " + min + ": " + count[0]);
for (int i = 1; i <= b; i++){
int low = s * i + min;
int high = s * (i + 1) + min;
System.out.println(low + " <= x < " + high + ": " + count[i]);
}
System.out.println("x >= " + max + ": " + count[b + 1]);
}
答案 0 :(得分:0)
您的count
数组的长度为1:int [] count = {0};
,但是您试图访问更高的索引:
if (is[i] < min){
count[0]++;
} else if (i >= max) {
count[b+1]++; //here
} else {
int n = min;
int index = 0;
while (i < n + s){
n += s;
index++;
count[i]++; // and here
}
}
由于数组中不存在除0以外的其他索引,因此它们超出了范围,因此您将获得异常。