显示字符串中的字符数

时间:2009-11-28 17:44:29

标签: java string

我有一个Java问题:我正在编写一个程序来读取字符串并显示该字符串中的字符数。我找到了一些示例代码,但我不太明白最后一部分 - 有人可以帮忙吗?

int[] count = countLetters(line.toLowerCase());

for (int i=0; i<count.length; i++)
{
    if ((i + 1) % 10 == 0)
            System.out.println( (char) ('a' + i)+ " " + count[i]);
    else
        System.out.print( (char) ('a' + i)+ " " +  count[i]+ " ");
}

public static int[] countLetters(String line)
{
    int[] count = new int[26];

    for (int i = 0; i<line.length(); i++)
    {
        if (Character.isLetter(line.charAt(i)))
            count[(int)(line.charAt(i) - 'a')]++;
    }

    return count;
}

5 个答案:

答案 0 :(得分:2)

你的最后一个循环是:

对于我们测试的每个字符,如果它是一个字母,如果是,我们相对于该字符递增计数器。这意味着'a'是0,'b'是1 ...(换句话说,'a'是'a' - 'a'是0,'b'是'b' - 'a'是1 ...)。

这是计算字符串中字符出现次数的常用方法。

答案 1 :(得分:1)

您发布的代码不是字符串的长度,而是小写字符串中出现的字母数字的出​​现次数。

Character.isLetter(line.charAt(i))

检索位置i处的字符,如果是字母则返回true

count[(int)(line.charAt(i) - 'a')]++;

增加索引character - 'a'的计数,026

该函数的结果是一个包含每个字母计数的26个整数数组。

计数数组的for循环每隔10个计数结束打印输出并使用

(char) ('a' + i)

打印计数所属的字母。

答案 2 :(得分:0)

我猜你是在计算字母的出现次数,而不是字符('5'也是一个字符)。

最后一部分:

for (int i = 0; i<line.length(); i++)
{
    if (Character.isLetter(line.charAt(i)))
        count[(int)(line.charAt(i) - 'a')]++;
}

迭代输入行并检查每个字符是否为字母。如果是,则递增该字母的计数。计数保存在26个整数的数组中(拉丁字母表中的26个字母)。字母'a'的计数保持在索引0,字母'b'保持在1,'z'保持在25。要获得索引,代码从字母值中减去值'a'(每个字符不仅是字符/ glyph,也是一个数值)。因此,如果字母是'a',它会减去'a'的值,该值应为0,依此类推。

答案 3 :(得分:0)

在方法countLetters中,for循环遍历该行中的所有字符。 if检查以确保它是一个字母,否则将被忽略。

line.charAt()在位置i处产生单个字符。其类型为char

现在在Java内部,char只是一个与字符代码对应的数字。小写'a'的字符代码为97,'b'为98,依此类推。 (int)强制从char转换为int。所以我们取字符代码,假设它是'b',所以代码是98,我们减去'a'的代码,即97,所以我们得到偏移量1(从字母表的开头)。对于字母表中的任何字母,偏移量将介于0和25之间(包括)。

因此我们将该偏移量用作数组count的索引,并使用++来递增它。然后,程序顶部的循环可以打印出计数。

顶部的循环使用反向“技巧”将这些偏移从0到25转换回从a到z的字母。

答案 4 :(得分:0)

“最后一部分”,循环的实现真的很难理解。接近混淆;)这里是count方法的重构(分为两种方法,一般用于所有字符,一种特殊用于小字母:

public static int[] countAllASCII(String line) {
  int[] count = new int[256];
  char[] chars = line.toCharArray();

  for (char c : chars) {
    int index = (int) c;
    if (index < 256) {
      count[index]++;
    }  
  }

  return count;
}

public static int[] countLetters(String line) {
    int[] countAll = countAll(line);        
    int[] result = new int[26];     
    System.arraycopy(countAll, (int) 'a', result, 0, 26); 

    return result;
}

一般想法:countAll方法只计算所有字符。是的,阵列更大,但在这些方面,今天没有人关心。优点:我不必测试每个char。第二种方法只是将感兴趣的区域复制到一个新的(结果)数组中并返回它。

修改

我也改变了我的代码以获得不那么不友好的评论。无论如何,谢谢Bombe。