-2

免责声明:这是家庭作业的一部分

所以我创建了一个包含每个字母计数的数组。它看起来像这样:

数组字符计数

charCount[0] = 10
charCount[1] = 6
charCount[2] = 4

我知道 0 = a,1 = b 等等。

现在我想使用星号将这些结果打印到图形表示中。例如:

*
*
*
*
*
**
**
**
***
***
***
ABC

我发现这相当困难,并不真正了解如何做到这一点。- 我做了一个函数来检查我的数组的最大值。

for (int i = 0; i < charCount.length; i++) {
    if (letterCount[i] > maxInt) {
    maxInt = charCount[i]; 
    }
}

然后我做了一个 for 循环来检查是否有任何匹配。

我的下一部分代码是:

for (int i = 0; i < letterCount.length; i++ ) {
    for (int j = 0; j <= maxInt; j++) {
        if (letterCount[i] == maxInt) {
        System.out.println("*");
        } if (letterCount[i]  == maxInt - j ) {
        System.out.println("*");
        } if (letterCount[i] != maxInt ) {
        System.out.println(" ");
    }
}

但在这里我卡住了。

  • 我如何一直打印星号并彼此相邻?我应该使用空间吗?
  • 我怎么知道什么时候停止打印?我的 maxInt - j 有意义吗?

有人可以指出我正确的方向吗?

我必须想出一个使用 for 循环和数组的解决方案,所以我还不能使用任何花哨的方法 :)

谢谢 :)

4

1 回答 1

2

想象一下,您想将其像条形图一样绘制到具有坐标的网格上,类似于您在学校中使用 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”(网格的高度)设置为输入数组中的最大数字。

于 2013-09-14T13:35:16.350 回答