使用星号绘制柱状图(处理负值):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(); } }
关键代码解释
- 极值计算:遍历数组找到最大的正数和最小的负数,这样我们就知道要画多少行,以及正负区域的边界在哪里。
- 逐行绘制逻辑:
- 正数行(row>0):如果数据点的值大于等于当前行,就画
*,否则留空 - 坐标轴行(row=0):统一画
|作为分隔线 - 负数行(row<0):如果数据点的值小于等于当前行,就画
*(因为负数越小,位置越靠下)
- 正数行(row>0):如果数据点的值大于等于当前行,就画
- 占位处理:用两个空格代替空位置,保证柱状图对齐整齐
你可以把随机生成数据的部分改成手动输入,或者调整数值范围,试试不同的测试用例——比如全是负数、正负混合的情况,看看效果是不是符合你的预期。
内容的提问来源于stack exchange,提问作者Mayuresh Patel
相关产品推荐
相关产品推荐

