Java数组求最值、平均值及柱状图功能故障排查求助
数组计算与柱状图功能代码修改建议
我已经成功初始化了一个包含30个1-100范围内随机整数的数组,目标是实现数组的最小值、最大值、平均值计算,以及柱状图展示功能,但当前编写的problem1和functionsp1两个类的代码无法正常运行。这是我第一次接触数组开发,请求提供修改建议。
原代码
problem1类
package arraystuff1; import java.util.Random; public class problem1 { public static void main(String[] args) { int min=0; int max=0; int avg=0; //initialize array Random randomNumbers = new Random(); final int Length = 30; int[] array1 = new int[Length]; for ( int counter = 0; counter < array1.length; counter++ ) { array1[ counter ] = 1+randomNumbers.nextInt( 100 ); } //array tested and produces correct output for ( int counter = 0; counter < array1.length; counter++ )//minimum { min = functionsp1.min(array1[counter],min); if(counter == Length-1) System.out.printf("The minimum value is: %d\n",min); } for ( int counter = 0; counter < array1.length; counter++ )//maximum { max = functionsp1.max(array1[counter],max); if(counter == Length-1) System.out.printf("The maximum value is: %d\n",max); } for ( int counter = 0; counter < array1.length; counter++ )//average { avg = functionsp1.avg(array1[counter],Length); if(counter == Length-1) System.out.printf("The average value is: %d\n",avg); } for ( int counter = 0; counter < array1.length; counter++ )//average { functionsp1.bar(array1[counter],Length);//print a line showing range of the bar graph use switch case to build frequencies for each 10th unit functionsp1.freq(array1[counter],Length);//print stars representing number of random numbers that fit in this category } } }
functionsp1类
package arraystuff1; public class functionsp1 { public static int min(int counter,int min)//input array index and length { if (counter < min) { counter = min; } return counter; } public static int max(int counter,int max) { if (counter > max) { counter = max; } return counter; } public static int avg(int current,int total)//input array length for total and index for current { int sum; int fintotal; for (int counter = 0; counter < total; counter++ ) { sum = current + sum; // random number 0-99 add 1 to make it 1-100 if (counter == total) fintotal = sum/total; return fintotal; } System.out.printf("The average of the array is: %2d",fintotal); //System.out.printf( "%s%8s\n", "Index", "Value" ); // column headings return fintotal; } public static void bar(int index,int limit)//length and array variable { System.out.println("Grade Distribution: "); for(int counter = 0; counter < limit;counter++) { if (counter ==10) System.out.printf("%5d: ", 100); else System.out.printf("%02d-%02d: ",counter*10,counter*10+9); } } public static void freq( int stars ) { for(int counter=0;counter<stars ; counter ++) System.out.print("*"); } // end main }
具体修改建议
1. 最小值计算逻辑修正
functionsp1的min方法逻辑完全颠倒:当前代码会导致返回值永远是初始的min(0),无法正确更新最小值。- 修改后的
min方法:
public static int min(int current, int min) { if (current < min) { min = current; } return min; }
- 初始化
min时设为数组第一个元素,避免初始值干扰:在problem1的main方法中,数组初始化后添加min = array1[0];
2. 最大值计算逻辑修正
max方法逻辑同样颠倒,导致最大值一直是初始的0。- 修改后的
max方法:
public static int max(int current, int max) { if (current > max) { max = current; } return max; }
- 初始化
max时设为数组第一个元素:max = array1[0];
3. 平均值计算彻底重构
- 原
avg方法逻辑混乱,未初始化sum会触发编译错误,且调用方式无法实现累加求和。 - 重构后的
avg方法(直接接收数组,内部完成求和与计算):
public static double avg(int[] array) { int sum = 0; for (int num : array) { sum += num; } return (double) sum / array.length; }
- 在
problem1的main方法中,删除原平均值循环,替换为:
double average = functionsp1.avg(array1); System.out.printf("The average value is: %.2f\n", average);
4. 柱状图功能重构
- 原调用方式会重复打印标题和错误的星号,需先统计区间频率再打印。
- 在
functionsp1中添加频率统计和柱状图打印方法:
// 统计每个10分区间的元素数量 public static int[] countFrequencies(int[] array) { int[] frequencies = new int[11]; // 对应0-9到90-99、100共11个区间 for (int num : array) { if (num == 100) { frequencies[10]++; } else { frequencies[num / 10]++; } } return frequencies; } // 打印柱状图 public static void printBarGraph(int[] frequencies) { System.out.println("Grade Distribution:"); for (int i = 0; i < frequencies.length; i++) { if (i == 10) { System.out.printf("%5d: ", 100); } else { int start = i * 10; int end = start + 9; System.out.printf("%02d-%02d: ", start, end); } // 打印对应数量的星号 for (int j = 0; j < frequencies[i]; j++) { System.out.print("*"); } System.out.println(); } }
- 在
problem1的main方法中,删除原柱状图循环,替换为:
int[] frequencies = functionsp1.countFrequencies(array1); functionsp1.printBarGraph(frequencies);
5. 细节优化
- 常量命名规范:将
Length改为ARRAY_LENGTH(常量建议全大写)。 - 可选优化:可以在一次数组遍历中同时完成最小值、最大值、求和计算,减少循环次数。
内容的提问来源于stack exchange,提问作者Brazos Wheeler
相关产品推荐
相关产品推荐

