我正在尝试创建一个方法,该方法接受一个字符串,然后根据字符串中字母的频率填充一个数组,其中数组[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 上面三个。
为了将直方图打印为列,其中字母位于列下方,您首先需要获取每个字母的频率,并找到最大频率。然后迭代字母,如果字母频率不小于最大频率,则打印 *
,否则打印空格。然后将最大值减一并重复。
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
我建议您使用调试器单步调试代码,以便更好地理解它是如何工作的。