有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java显示字符串中的字符数

我有一个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) 个答案

  1. # 1 楼答案

    最后一个循环是:

    对于每个字符,我们测试它是否是一个字母,如果是,我们增加相对于该字符的计数器。也就是说,“a”是0,“b”是1。。。(换句话说,'a'是'a'-'a'是0,'b'是'b'-'a'是1…)

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

  2. # 2 楼答案

    我猜你是在计算字母的出现,而不是字符(“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”(每个字符不仅是一个字符/字形,而且是一个数值)。因此,如果字母是‘a’,它减去‘a’的值,该值应为0,依此类推

  3. # 3 楼答案

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

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

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

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

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

  4. # 4 楼答案

    “最后一部分”,循环的实现真的很难理解。接近模糊;)这里是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方法只计算所有字符。是的,阵列更大,但在这些维度上,今天没有人关心。优点:我不必测试每个字符。第二个方法只是将感兴趣的区域复制到一个新的(生成的)数组中并返回它

    编辑

    我还修改了代码,添加了一条不那么友好的评论。谢谢你,邦比

  5. # 5 楼答案

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

    Character.isLetter(line.charAt(i))
    

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

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

    递增索引character - 'a'处的计数,这是026

    函数的结果是26个整数的数组,其中包含每个字母的计数

    计数数组上的for循环每10次计数结束一次打印输出并使用

    (char) ('a' + i)
    

    打印计数所属的字母