如何在java中打印字符的频率

时间:2014-09-14 15:28:01

标签: java arrays frequency

我对Java很新,我想在字符串中打印字符的频率('过滤')。我将输入过滤到只剩下我的'az'数组中的字符的点。在我看来这应该有用,但我显然做错了,因为我要么收到错误信息(“超出范围”),要么就是不打印正确的值。

char [] az = {'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', '0', '1',
              '2', '3', '4', '5', '6', '7', '8', '9', ' '};
int [] freq = new int [37];
char c;
for (int i=0; i<37; i++) {
  c = filtered.charAt(i);
  if (c == az[i])
    freq[c]++;
}

System.out.println("char"+"\t"+"freq");

for (int i=0; i<37; i++) {
  System.out.println("   "+i+"\t     "+freq[i]);

2 个答案:

答案 0 :(得分:0)

我纠正了你的代码的逻辑,这是错误的,即使没有引发异常。

String filtered = "would you meet me at 3 in the morning";
char[] az = { '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', '0', '1', '2', '3', '4', '5', '6', '7', '8',
                '9', ' ' };
int[] freq = new int[az.length];
char c;
for (int i = 0; i < filtered.length() ; i++) {
    c = filtered.charAt(i);
    if (c == ' ')
        freq[az.length - 1]++;
    else if (Character.isAlphabetic(c))
        freq[c - 'a']++;
    else 
        freq[c - '0' + 26]++;
}

for (int i = 0; i < az.length; i++) 
    System.out.println("   " + az[i] + "\t     " + freq[i]);

这就是你错了:

  • 你硬编码了循环的边界,这不是一个好主意
  • 您将每个az[i]与每个c = filtered.charAt(i)进行了比较,但c不一定在索引i

答案 1 :(得分:0)

您正在混合索引。这是您的代码的未优化修复。

您可以看到命名变量ci,...有助于避免错误。

char[] az = {'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', '0', '1',
        '2', '3', '4', '5', '6', '7', '8', '9', ' '};
int[] freq = new int[az.length];
for(int filteredIndex = 0; filteredIndex < filtered.length(); ++filteredIndex) {
    char filteredCharacter = filtered.charAt(filteredIndex);
    for (int azIndex = 0; azIndex < az.length; azIndex++) {
        if (filteredCharacter == az[azIndex])
            freq[azIndex]++;
    }
}

System.out.println("char" + "\t" + "freq");

for (int azIndex = 0; azIndex < 37; azIndex++) {
    System.out.println("   " + az[azIndex] + "\t     " + freq[azIndex]);
}