Java中的字符类

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) {

下面是一个简短的程序,它统计用户输入的任何给定单词的字母。 我正在试图弄清楚以下几行在这个程序中实际做了什么:

计数[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) {
            //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的子集。