使用整数数组制作直方图

问题描述 投票:0回答:1

我正在尝试创建一个方法,该方法接受一个字符串,然后根据字符串中字母的频率填充一个数组,其中数组[0]是A的数量等。然后它接受该数组并打印出直方图每次字符串中出现一个字母时,所有上面带有星号的字母都会出现在列中。我能够编写获取字符串中每个字母数量的部分,但我不知道如何打印出直方图。

void drawHistogram() {
    int[] frequency = new int[26];
    for (int i = 0; i < text.length(); i++) {
        if (Character.isLetter(text.charAt(i))) {
            frequency[Character.getNumericValue(Character.toLowerCase(text.charAt(i))) - 10] += 1;
        }
    }
}

text 是类中的字符串变量。

例如,如果文本=“我喜欢解决问题。”,程序应该打印这个直方图

                      *     *   
        *       *     *     *             *           
  *     *   *   *     * * * * *   * *     *       
---------------------------------------------------
a b c d e f g h i j k l m n o p q r s t u v w x y z

b、g、m、n、p、r 和 s 上方应有一个星号。 e、i 和 v 上面两个。l 和 o 上面三个。

java arrays string integer histogram
1个回答
0
投票

为了将直方图打印为列,其中字母位于列下方,您首先需要获取每个字母的频率,并找到最大频率。然后迭代字母,如果字母频率不小于最大频率,则打印 *,否则打印空格。然后将最大值减一并重复。

public class Histogram {
    public static void main(String[] args) {
        String text = "I love problem-solving.";
        int[] frequency = new int[26];
        int max = 0;
        for (int i = 0; i < text.length(); i++) {
            if (Character.isLetter(text.charAt(i))) {
                int ndx = Character.getNumericValue(Character.toLowerCase(text.charAt(i))) - 10;
                frequency[ndx] += 1;
                if (frequency[ndx] > max) {
                    max = frequency[ndx];
                }
            }
        }
        for (int i = max; i > 0; i--) {
            for (int j = 0; j < frequency.length; j++) {
                if (frequency[j] >= i) {
                    System.out.print("*");
                }
                else {
                    System.out.print(" ");
                }
                System.out.print(" ");
            }
            System.out.println();
        }
        System.out.println("-".repeat(51));
        System.out.println("a b c d e f g h i j k l m n o p q r s t u v w x y z");
    }
}

这是输出:

* * * * * * * * * * * * * * * * * * * --------------------------------------------------- a b c d e f g h i j k l m n o p q r s t u v w x y z

我建议您使用调试器单步调试代码,以便更好地理解它是如何工作的。

© www.soinside.com 2019 - 2024. All rights reserved.