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

使用星号绘制柱状图(处理负值):Java自学代码实现难题

Java柱状图绘制:把负值思路转化为可运行代码

嘿,我懂这种“思路在脑子里转但就是写不出代码”的憋屈感!你已经搞定了正值绘制,也明白负值要往坐标轴左边画的逻辑,那咱们直接把这个思路拆解成代码,填进你的框架里就行。

核心逻辑梳理

要同时兼容正负值,咱们得先明确两个关键:

  • 找到数据里的最大正值和最小负值(也就是绝对值最大的负数),这样能确定整个柱状图的总高度(正数高度+负数高度)
  • 逐行绘制:从最顶部的最大正值开始,一直画到最底部的最小负值,每一行判断对应位置的数值是否需要画星号,同时把中间的坐标轴(比如用|表示)固定好

补全后的完整代码

import java.util.Scanner;
import java.util.Random;

public class BarChart {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Random gen = new Random();

        // 读取数组长度输入
        System.out.print("请输入数据点的数量:");
        int length = in.nextInt();
        int[] data = new int[length];

        // 生成随机数据(也可以改成手动输入)
        System.out.println("生成的随机数据:");
        for (int i = 0; i < length; i++) {
            data[i] = gen.nextInt(21) - 10; // 生成-10到10之间的随机数
            System.out.print(data[i] + " ");
        }
        System.out.println();

        // 第一步:计算极值
        int maxPositive = 0;
        int minNegative = 0;
        for (int num : data) {
            if (num > maxPositive) {
                maxPositive = num;
            }
            if (num < minNegative) {
                minNegative = num;
            }
        }

        // 总绘制行数 = 正数最大高度 + 负数最大高度(绝对值)
        int totalRows = maxPositive + Math.abs(minNegative);

        // 第二步:逐行绘制
        // 从顶部(最大正值)开始往下画
        for (int row = maxPositive; row >= minNegative; row--) {
            // 先处理每一行的每个数据点
            for (int num : data) {
                // 情况1:当前行是正数行,判断该数据是否大于等于当前行
                if (row > 0) {
                    if (num >= row) {
                        System.out.print("* ");
                    } else {
                        System.out.print("  "); // 空占位
                    }
                }
                // 情况2:当前行是坐标轴(row=0)
                else if (row == 0) {
                    System.out.print("| ");
                }
                // 情况3:当前行是负数行,判断该数据是否小于等于当前行
                else {
                    if (num <= row) {
                        System.out.print("* ");
                    } else {
                        System.out.print("  "); // 空占位
                    }
                }
            }
            // 每行结束换行,同时标注当前行的数值
            System.out.println("(" + row + ")");
        }

        in.close();
    }
}

关键代码解释

  1. 极值计算:遍历数组找到最大的正数和最小的负数,这样我们就知道要画多少行,以及正负区域的边界在哪里。
  2. 逐行绘制逻辑:
    • 正数行(row>0):如果数据点的值大于等于当前行,就画*,否则留空
    • 坐标轴行(row=0):统一画|作为分隔线
    • 负数行(row<0):如果数据点的值小于等于当前行,就画*(因为负数越小,位置越靠下)
  3. 占位处理:用两个空格代替空位置,保证柱状图对齐整齐

你可以把随机生成数据的部分改成手动输入,或者调整数值范围,试试不同的测试用例——比如全是负数、正负混合的情况,看看效果是不是符合你的预期。

内容的提问来源于stack exchange,提问作者Mayuresh Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:26