You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:05:34