Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
开始Java(直方图)_Java_Histogram - Fatal编程技术网

开始Java(直方图)

开始Java(直方图),java,histogram,Java,Histogram,我正在学习一个Java初学者课程,任务是创建一个直方图程序,输出如下:(100和10是用户输入) 有多少号码?100 间隔几次?十, Histogram -------------------------------------------------------- 1 ****(4) 2 ******(6) 3 ***********(11) 4 *****************(17) 5 **************************(26) 6 *****

我正在学习一个Java初学者课程,任务是创建一个直方图程序,输出如下:(100和10是用户输入)

有多少号码?100 间隔几次?十,

Histogram
--------------------------------------------------------
  1 ****(4)
  2 ******(6)
  3 ***********(11)
  4 *****************(17)
  5 **************************(26)
  6 *************************(25)
  7 *******(7)
  8 ***(3)
  9 (0)
 10 *(1)
--------------------------------------------------------
我的代码给出了以下输出,但是,谁能帮我指出哪里出了问题,非常感谢

How Many Numbers? 10
How Many Intervals? 10

Histogram
--------------------------------------------------------
 1 **********(10)
 2 **********(10)
 3 **********(10)
 4 **********(10)
 5 **********(10)
 6 **********(10)
 7 **********(10)
 8 **********(10)
 9 **********(10)
 10 **********(10)
对于输入,100和10我得到错误消息:

线程“main”java.lang.ArrayIndexOutOfBoundsException中出现异常异常:10 在Lab6.main(Lab6.java:44)中,我标记了下面的第44行

哪些链接指向此代码

             intervalValue[j]++;
我不确定如何附加生成器(.jar)文件,它应该只是为我们生成随机的。再次感谢

mport java.util.Scanner;

public class Lab6 {

    public static void main(String[] args) {

        int numbers, intervals;
        double intervalWidth;

        double max, mins, range;

        Scanner keyboard = new Scanner(System.in);

        System.out.print("How Many Numbers? ");

        numbers = keyboard.nextInt();

        System.out.print("How Many Intervals? ");

        intervals = keyboard.nextInt();

        double [] generate = new double[numbers];

        generate = randomGenerator(numbers);

        max = maximum(generate);

        mins = minimum(generate);

        range = max - mins;

        intervalWidth = range / intervals;

        int [] intervalValue = new int[intervals];

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

            for (int j = 0; j<generate.length; j++){
                double imin = mins+j*intervalWidth;
                double imax = max +j*(intervalWidth);
                if(generate[i] >= imin && generate[i] < imax)
                    intervalValue[j]++;         //LINE 44
            }
        }

        System.out.println("Histogram");

        System.out.println("--------------------------------" +
                           "------------------------");

        for (int a=0; a < intervalValue.length; a++) {

            System.out.print(" " + (a+1) + " ");

            for (int b=0; b < intervalValue[a]; b++) {
                System.out.print("*"); 
            }

            System.out.println("(" + intervalValue[a] + ")");
        }
    }

    private static double [] randomGenerator(int number) {
        double [] generate;

        generate = Generator.getData(number);

        return generate; 
    }

    private static double maximum(double [] a) {

        double max = a[0];

        for (int i = 1; i < a.length; i++) {        
            if (a[i] > max) {
                max = a[i];
            }         
        }

        return max;
    }

    private static double minimum(double [] a) {

        double mins = a[0];

        for (int i = 1; i < a.length; i++) {
            if (a[i] < mins) {
                mins = a[i];
            }
        }

        return mins;
    }
}
mport java.util.Scanner;
公共类Lab6{
公共静态void main(字符串[]args){
整数,间隔;
双间隔宽度;
双倍最大值,分钟,范围;
扫描仪键盘=新扫描仪(System.in);
系统输出打印(“多少个数字?”);
数字=键盘.nextInt();
系统输出打印(“多少间隔?”);
间隔=键盘.nextInt();
double[]生成=新的double[数字];
生成=随机生成器(数字);
最大值=最大值(生成);
分钟=最小值(生成);
范围=最大-分钟;
间隔宽度=范围/间隔;
int[]intervalValue=新的int[间隔];
for(int i=0;imax){
max=a[i];
}         
}
返回最大值;
}
专用静态双最小值(双[]a){
双分钟=a[0];
for(int i=1;i
使用像eclipse这样的IDE,运行程序并查看第44行的位置。这就是你获得ArrayIndexOutOfBoundsException阵列索引的地方,也是你需要确保自己不会脱离债券的地方。 java中的数组在索引0处有第一个项,因此10个项长的数组将编号为0,1,2,3,4,5,6,7,8,9。如果它发生在10,那么您可能正在迭代一步。 当你到达那里时,确保“intervalValue[j]”中的j不是10


没有完整的异常,即编译的源代码,也没有更正粘贴的源代码中的行号。没有更多的事情要做。弄清楚它将帮助你获得与实验室其他部分一样多的知识。试一试。

您需要删除第43行末尾的分号:

if(generate[i] >= imin && generate[i] < imax);
您在外部循环中迭代生成的数字;因此,您应该迭代内部循环中的间隔,以确定每个生成的数字所属的间隔


请看一下用于确定循环中当前间隔边界的代码:

double imin = mins+j*intervalWidth;
double imax = max +j*(intervalWidth);
这些行需要修改以产生正确的值。做一点“纸笔调试”来确定它们当前出错的原因


我将把剩下的作为练习留给读者。我稍后会回来看看你是否需要进一步的帮助

intervalValue[j]++; 

j上升到数字的数量,但InterValve值是从间隔的数量分配的,如果这两个数字不相同,您将得到您在此处看到的错误。

您的数组异常似乎是由于两次使用generate.length导致的-尽管您粘贴的代码似乎是由此编辑的

但是,除此之外,问题在于嵌套循环。除了第一个内部循环中的错误数组大小外,您的操作是正确的。 然后,在if语句中,您希望增加该值,如果该值在正确的间隔内,则只增加该值;使用当前代码,每次递增其中的每一个,这解释了输出

获取您自己的代码并发表评论:

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

  for (int j = 0; j<intervals; j++){ // could use intervalValues.length here; it's all preference
    double imin = mins+j*intervalWidth;
    double imax = mins +(intervalWidth)*(j+1);
    if(generate[i] >= imin && generate[i] < imax) 
        // for(int j1 = 0; j1 < intervalValue.length; j1++) <- this was causing the bad output
        /* I assume the j1 from your code was during a debug attempt. Changed back,
           since the preceeding loop has been removed */
        intervalValue[j]++; 


  }

}
for(int i=0;i因为(int j=0;j因为我在一个星期六感觉很慷慨,所以我尝试了一下并重写了你的循环

for (int j=0; j < generate.length; j++) {
    for(int i = 0; i < intervals; i++) {
        double imin = mins + i * intervalWidth;
        double imax = mins + (intervalWidth) * (i + 1);
        if(i == intervals - 1) imax = Double.POSITIVE_INFINITY;
        if(i == 0) imin = Double.NEGATIVE_INFINITY;

        if (generate[j] >= imin && generate[j] < imax) {
            intervalValue[i]++;
            break;
        }
    }
}
for(int j=0;j=imin&&generate[j]

“无限”功能是捕捉直方图中的最小值和最大值。

这将为您提供一个非常漂亮(基本)的直方图。试试看

import java.util.HashMap;
import java.util.Map;

public class Histogram {
    public static void main(String[] args) {
        int[] age = { 25, 26, 33, 26, 27, 21, 26, 33, 21, 33, 21, 38, 19, 19};


        HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();

        for (int i = 0; i < age.length; i++) {
            int c = 0;

            for (int j = 0; j < age.length; j++) {
                if (age[i] == age[j]) {
                    c++;
                }
            }
            m.put(age[i], c);

        }

        System.out.println("Histogram\n------------");
        for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
            int key = entry.getKey();
            int value = entry.getValue();
            System.out.printf("%3d | ", key);
            for (int i = 0; i < value; i++) {
                System.out.print("=");
            }
            System.out.print(" " + value);
            System.out.println();
        }

    }

我使用HashMap来保存两个相关的值,即数组元素及其频率(它出现的频率)

然后一个嵌套的循环按数组中的每个元素循环,并使用
c
变量计算其频率


之后,我用for each loop和normal loop打印它

如何使它们相同,或者至少不产生错误?-谢谢,U
import java.util.HashMap;
import java.util.Map;

public class Histogram {
    public static void main(String[] args) {
        int[] age = { 25, 26, 33, 26, 27, 21, 26, 33, 21, 33, 21, 38, 19, 19};


        HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();

        for (int i = 0; i < age.length; i++) {
            int c = 0;

            for (int j = 0; j < age.length; j++) {
                if (age[i] == age[j]) {
                    c++;
                }
            }
            m.put(age[i], c);

        }

        System.out.println("Histogram\n------------");
        for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
            int key = entry.getKey();
            int value = entry.getValue();
            System.out.printf("%3d | ", key);
            for (int i = 0; i < value; i++) {
                System.out.print("=");
            }
            System.out.print(" " + value);
            System.out.println();
        }

    }
Histogram
------------
 33 | === 3
 19 | == 2
 21 | === 3
 38 | = 1
 25 | = 1
 26 | === 3
 27 | = 1