我的逻辑不适用于计算直方图

时间:2019-10-07 06:16:55

标签: java

编写一个程序Example.java以计算数据以构造从文件读取的整数值的直方图。直方图是一个条形图,其中每个条形的长度给出了落入某个值范围(通常称为bin)的项目数。您实际上不会绘制条形图,但会打印出每个纸槽的大小。

您的程序应带有四个命令行参数:

  1. 包含array中的integers的文件名
  2. 整数b给出要排序的bins的数量。
  3. 整数min在最小的bin中给出最小的数字。
  4. 一个整数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]);
      }

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以外的其他索引,因此它们超出了范围,因此您将获得异常。