想象一下,您想将其像条形图一样绘制到具有坐标的网格上,类似于您在学校中使用 x 和 y 坐标所做的事情。继续您的示例,每个 y 坐标代表数组的索引,例如特定字母,其中 x - 坐标量。
由于这些数字可能会变得非常大,因此正如您所见,将 x 坐标上的 +1 映射到 +1 字母并不是最佳做法。
因此,您需要确定图表的大小,假设它应为 10 个字母宽:
y <- 10
^
a|**********
b|**********
c|**********
-------------> x
12345 ...10
现在重要的是,字母相对于彼此的出现由那些 *-bars 正确表示,这意味着只要您绘制 x 坐标,出现最多的字母就可以用条形显示,在这种情况下10.
让我们以此作为示例数据集
0 := 10
1 := 6
2 := 4
3 := 14
如果 x 坐标为 10 * 长,则条目 3(数组中最高)的数量为 14,需要为 10 * 长。有了这些信息,您可以通过除以 10(x 长度)/ 14(最大数量)~= 0.71(因子)来计算因子,您可以将此因子应用于所有数字以获得要绘制的星数。
这里作为java中的一个例子:
int xLength = 10;
int[] charCount = new int[5];
charCount[0] = 10;
charCount[1] = 4;
charCount[2] = 7;
charCount[3] = 14;
charCount[4] = 1;
// determine the biggest value:
int biggest = 0;
for(int n:charCount) {
if(n>biggest)
biggest = n;
}
System.out.println("Biggest no: " + biggest);
double factor = (double)xLength / (double)biggest;
System.out.println("Using factor: " + factor);
for(int i = 0; i < charCount.length; i++) {
System.out.print("no " + i + ":");
for(int j = 0; j < charCount[i] * factor; j++) {
System.out.print("*");
}
System.out.println();
}
这将输出:
Biggest no: 14
Using factor: 0.7142857142857143
no 0:********
no 1:***
no 2:*****
no 3:**********
no 4:*
编辑:
如果要垂直打印条形图(在 y 坐标上),或以任何其他方式将其旋转,请将条形图存储在网格中,例如使用 String[][] 数组,其中 arr[2][3] 将是 y 坐标 2 和 x 坐标 3。然后你可以用上面的因子和图表的最大高度来计算一个特定的点/坐标是否应该用“*”或“”(什么都没有)填充:
// make a grid to draw the chart
// the height is the the number we defined as maximum height (xLength)
// and the width is one column for every char (charCount.length):
String[][] grid = new String[charCount.length][xLength];
// initialize the grid with spaces:
for(int x = 0; x < grid.length; x++) {
for(int y = 0; y < grid[x].length; y++) {
grid[x][y] = " ";
}
}
// We will go through the grid column by column:
for(int x = 0; x < grid.length; x++) {
// this will be called once for every char
// so just replace spaces in the grid in this column
// by "*" if it's a row (value of y) <= the amount
// of chars times the factor
for(int y = 0; y < grid[x].length; y++) {
if(y <= charCount[x] * factor) {
grid[x][y] = "*";
}
}
}
// print the grid row by row (think of it upside down, (0,0) is the upper left point
// so we start with the last (the no of elements in the array minus 1, counting from 0)
System.out.println("^");
for(int y = grid[0].length - 1; y >= 0; y--) {
System.out.print("|");
for(int x = 0; x < grid.length; x++) {
System.out.print(grid[x][y]);
}
// finish the line:
System.out.println();
}
// draw the bottom line:
System.out.println("------->");
System.out.println(" abcde");
在上面的代码下方添加了这段代码,输出将是:
Biggest no: 14
Using factor: 0.7142857142857143
no 0:********
no 1:***
no 2:*****
no 3:**********
no 4:*
^
| *
| *
|* *
|* *
|* **
|* **
|* **
|****
|****
|*****
------->
abcde
如果您想将剩余的金额放在 y 条上,请将行号除以因子。
如果您想在不放大或缩小的情况下使用绝对值(这对于大数字来说会很快填满屏幕),只需将“xLength”(网格的高度)设置为输入数组中的最大数字。