Java中的字符类
下面是一个简短的程序,它统计用户输入的任何给定单词的字母。 我正在试图弄清楚以下几行在这个程序中实际做了什么: 计数[s.charAti-'a']++;//我不明白-‘a’在做什么 System.out.printlnchar'a'+i//我不知道'a'+i实际上做了什么Java中的字符类,java,character,Java,Character,下面是一个简短的程序,它统计用户输入的任何给定单词的字母。 我正在试图弄清楚以下几行在这个程序中实际做了什么: 计数[s.charAti-'a']++;//我不明白-‘a’在做什么 System.out.printlnchar'a'+i//我不知道'a'+i实际上做了什么 import java.util.Scanner; public class Listing9_3 { public static void main(String[] args) {
import java.util.Scanner;
public class Listing9_3 {
public static void main(String[] args) {
//Create a scanner
Scanner input = new Scanner (System.in);
System.out.println("Enter a word to find out the occurences of each letter: ");
String s = input.nextLine();
//Invoke the count Letters Method to count each letter
int[] counts = countLetters(s.toLowerCase());
//Display results
for(int i = 0; i< counts.length; i++){
if(counts[i] != 0)
System.out.println((char)('a' + i) + " appears " +
counts[i] + ((counts[i] == 1)? " time" : " times"));
***//I don't understand what the 'a' + i is doing
}
}
public static int[] countLetters(String s) {
int[] counts = new int [26]; // 26 letters in the alphabet
for(int i = 0; i < s.length(); i++){
if(Character.isLetter(s.charAt(i)))
counts[s.charAt(i) - 'a']++;
***// I don't understand what the - 'a' is doin
}
return counts;
}
}
因为您希望数组只包含从“a”到“z”的每个字母的计数 因此,要正确索引数组中的每个字母计数,您需要一个映射字母->索引,其中“a”->0,“b”->1到“z”->25 每个字符由16位上的一个整数值表示,从0到65535。您只对字母“a”到“z”感兴趣,它们分别具有值97和122 你如何得到地图 这可以使用技巧s.charAti-“a”来完成 这将确保此操作返回的值介于0和25之间,因为您知道s.charAti将返回一个介于“a”和“z”之间的字符。您正在以小写形式转换用户的输入,并使用character.isleter 因此,您得到了所需的映射来计算单词中每个字母的出现次数
另一方面,char'a'+i执行相反的操作。i从0到25不等,您分别得到了从“a”到“z”的字母。您只需将添加的结果强制转换为char,否则您将看到其unicode值被打印。因为您希望数组只包含从“a”到“z”的每个字母的计数
counts[s.charAt(i) - 'a']++; // I don't understand what the - 'a' is doing
assume charAT(i) is 'z'
now z-a will be equal to 25 (subtract the unicode / ASCII values).
so counts[25]=counts[25]+1; // just keeps track of count of each character
因此,要正确索引数组中的每个字母计数,您需要一个映射字母->索引,其中“a”->0,“b”->1到“z”->25
每个字符由16位上的一个整数值表示,从0到65535。您只对字母“a”到“z”感兴趣,它们分别具有值97和122
你如何得到地图
这可以使用技巧s.charAti-“a”来完成
这将确保此操作返回的值介于0和25之间,因为您知道s.charAti将返回一个介于“a”和“z”之间的字符。您正在以小写形式转换用户的输入,并使用character.isleter
因此,您得到了所需的映射来计算单词中每个字母的出现次数
另一方面,char'a'+i执行相反的操作。i从0到25不等,您分别得到了从“a”到“z”的字母。您只需将加法的结果强制转换为char,否则您将看到其unicode值被打印出来。字符在Java中是一种整数;整数是与Unicode图表上的字符关联的数字。因此,“a”实际上是整数97;'b’是98,从‘z’开始依次类推。因此,s.charAti返回一个字符;假设它是英文字母表中的一个小写字母,从中减去“a”,结果“a”为0,“b”为1,“c”为2,依此类推
counts[s.charAt(i) - 'a']++; // I don't understand what the - 'a' is doing
assume charAT(i) is 'z'
now z-a will be equal to 25 (subtract the unicode / ASCII values).
so counts[25]=counts[25]+1; // just keeps track of count of each character
您可以在中看到Unicode图表的前4096个字符,并且还会引用图表的其他页面。您将看到“a”是U+0061,它是十六进制,=97十进制。字符在Java中是一种整数;整数是与Unicode图表上的字符关联的数字。因此,“a”实际上是整数97;'b’是98,从‘z’开始依次类推。因此,s.charAti返回一个字符;假设它是英文字母表中的一个小写字母,从中减去“a”,结果“a”为0,“b”为1,“c”为2,依此类推
您可以在中看到Unicode图表的前4096个字符,并且还会引用图表的其他页面。您将看到“a”是U+0061,它是十六进制,=97十进制。char实际上是一个无符号16位整数。当您添加a时,您正在为a添加ASCII值。当您减去a时,您正在减去相同的值,但不必查找该值。Unicode值恰好在数字上等于ASCII值,因为ASCII是Unicode的子集。char实际上是一个无符号16位整数。当您添加a时,您是在为a添加ASCII值。当您减去a时,您是在减去相同的值,但不必查找这是哪个值。Unicode值恰好在数字上等于ASCII值,因为ASCII是Unicode的子集。