直方图的循环结构

时间:2017-02-26 20:47:19

标签: java arrays loops methods histogram

我试图编写一个Java程序,为数组中每次出现的值生成一个星号直方图。

如果元素分别为0,1,2,3,4,5,6,7,8,9,则每次出现的输出应为星号。例如,

0:*
1:*
2:*
3:*
4:*
5:*
6:*
7:*
8:*
9:*

但是,我的输出是

0:**********
1:
2:
3:
4:
5:
6:
7:
8:
9:

以下代码是我自己的代码。

public static void drawHistogram(double[] array) {

    String count = "";

    for (int i = 0; i < array.length; i++) {
        if (array[i] >= 0 && array[i] < 1) {
            count += "*";
        } else if (array[i] >= 1 && array[i] < 2) {
            count += "*";
        } else if (array[i] >= 2 && array[i] < 3) {
            count += "*";
        } else if (array[i] >= 3 && array[i] < 4) {
            count += "*";
        } else if (array[i] >= 4 && array[i] < 5) {
            count += "*";
        } else if (array[i] >= 5 && array[i] < 6) {
            count += "*";
        } else if (array[i] >= 6 && array[i] < 7) {
            count += "*";
        } else if (array[i] >= 2 && array[i] < 8) {
            count += "*";
        } else if (array[i] >= 2 && array[i] < 9) {
            count += "*";
        } else if (array[i] >= 9 && array[i] < 10) {
            count += "*";
        } else if (array[i] >= 10 && array[i] < 11) {
            count += "*";
        }
    }
    for (int j = 0; j <= 10; j++) {
        System.out.print(j + count);
        count = "";
        System.out.println();
    }
}

如何解决此问题?

3 个答案:

答案 0 :(得分:0)

public static void drawHistogram(double[] array) {

        String count[] = new String[array.length];

        for (int i = 0; i < array.length; i++) {
            if (array[i] >= 0 && array[i] < 1) {
                count[0] = "*";
            } else if (array[i] >= 1 && array[i] < 2) {
                count[1] = "*";
            } else if (array[i] >= 2 && array[i] < 3) {
                count[2] = "*";
            } else if (array[i] >= 3 && array[i] < 4) {
                count[3] = "*";
            } else if (array[i] >= 4 && array[i] < 5) {
                count[4] = "*";
            } else if (array[i] >= 5 && array[i] < 6) {
                count[5] = "*";
            } else if (array[i] >= 6 && array[i] < 7) {
                count[6] = "*";
            } else if (array[i] >= 2 && array[i] < 8) {
                count[7] = "*";
            } else if (array[i] >= 2 && array[i] < 9) {
                count[8] = "*";
            } else if (array[i] >= 9 && array[i] < 10) {
                count[9] = "*";
            } else if (array[i] >= 10 && array[i] < 11) {
                count[10] = "*";
            }
        }
        for (int j = 0; j <= 10; j++) {
            System.out.print(j + count[j]);
            System.out.println();
        }
}

答案 1 :(得分:0)

您似乎只使用一个变量来计算此方法中数字的出现次数。这会导致程序显示0出现9次,其余数字出现0次。我同意评论中的用户David Choweller,他建议你可以使用数组来解决这个问题。但是,另一种解决方案可能是HashMap,您可以将数字存储为键,将要打印的字符串存储为值。然后,您可以像当前一样使用循环中的数字循环,并打印出与它们关联的值。

答案 2 :(得分:0)

此解决方案使用(int) Math.floor(array[i])选择要放入double值的括号,从而删除多个if-then-else语句。我还使用StringBuilder而不是String来使重复的星号串联更有效。

public static void drawHistogram(double[] array) {

    StringBuilder histoGram[] = new StringBuilder[11];
    for (int i = 0; i < histoGram.length; i++) {
        histoGram[i] = new StringBuilder();
    }

    for (int i = 0; i < array.length; i++) {
        int bracket = (int) Math.floor(array[i]);
        if (bracket >= 0 && bracket < histoGram.length) {
            histoGram[bracket].append("*");
        }
    }
    for (int j = 0; j < 11; j++) {
        System.out.format("%02d: %s\n", j, histoGram[j].toString());
    }
}

测试main方法:

public static void main(String args[]) {
    double[] testValues = new double[100];
    for (int i = 0; i < 100; i++) {
        testValues[i] = Math.random() * 11.0;
    }
    drawHistogram(testValues);
}

示例输出:

00: *******
01: ********
02: ***********
03: ************
04: ********
05: **********
06: *******
07: ********
08: **********
09: ************
10: *******