我有一个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;
}
答案 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'
的计数,0
到26
。
该函数的结果是一个包含每个字母计数的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。