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