Java 为什么要使用string.charAt(index)';a';在爪哇? publicstaticvoidmain(字符串[]args)引发IOException{ BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); 字符串s=br.readLine(); int[]arr=新int[26]; for(int i=0;i

Java 为什么要使用string.charAt(index)';a';在爪哇? publicstaticvoidmain(字符串[]args)引发IOException{ BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); 字符串s=br.readLine(); int[]arr=新int[26]; for(int i=0;i,java,arrays,character,non-ascii-characters,Java,Arrays,Character,Non Ascii Characters,arr由一个大小为26的int数组组成,它也是英文字母表中的字母数。循环所做的就是计算字母的频率,通过字母表中的索引表示,arr[0]是'a',arr[1]是'b',等等 它的技术细节可以简单解释。s.charAt(i)在指定的位置i返回一个char实例。char在Java中也可以表示为字节。然后减法取ASCII值(表示为字节)从i的当前字符中删除“a”。因此,最终得到的是'a'==0,'b'-'a'==1,依此类推 请注意,这可能不是计算字符数的最佳方法,因为字符串可能包含的不仅仅是小写字母(

arr
由一个大小为26的int数组组成,它也是英文字母表中的字母数。循环所做的就是计算字母的频率,通过字母表中的索引表示,
arr[0]
'a'
arr[1]
'b'
,等等

它的技术细节可以简单解释。
s.charAt(i)
在指定的位置
i
返回一个
char
实例。
char
在Java中也可以表示为字节。然后减法取ASCII值(表示为
字节
)从
i
的当前字符中删除“a”。因此,最终得到的是
'a'==0
'b'-'a'==1
,依此类推


请注意,这可能不是计算字符数的最佳方法,因为字符串可能包含的不仅仅是小写字母(例如大写字母)和更多符号。

此代码为字母表中的每个字母生成一个类似直方图的计数器。请试着打印一个字符,如
'a'
,如下所示:

public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String s = br.readLine();
    int[] arr = new int[26];
    for(int i=0;i<s.length();i++)
        arr[s.charAt(i)-'a']++;
    
    int odds = 0;
    for(int i=0;i<26;i++)
        if(arr[i]%2!=0)
            odds++;
    
    if(odds%2==1 || odds==0)
        System.out.println("First");
    else
        System.out.println("Second");

}
每个
char
都有一个介于0和65535之间的对应Unicode值。减去
'a'
(或,97)将字母表中的每个字母缩放到0-26范围,该范围对应于
arr
数组中的“bucket”。以下是一个示例:

System.out.println((int)'a'); // Output: 97
代码中的第二个循环检查每个计数的奇偶性,以确定哪些是奇数。最后,最终打印条件检查出现奇数的字母总数。如果此总数为
0
或其本身为奇数,则打印
“First”
,否则打印
“second”

使用
a
z
之外的任何字符或大写字母尝试此代码。它将崩溃,因为字符的ASCII表示超出了数组的大小,您将得到
索引自动边界异常

下面是一个示例程序,显示如何构建直方图,并通过加法将其输出转换回字母:

System.out.println('z' - 'a'); // Output: 25 (the last bucket in the array)
System.out.println('a' - 'a'); // Output: 0 (the first bucket in the array)

'a'
是一个
char
文字。
char
是一个整数类型,因此使用
char
的算术定义很好,并产生一个整数结果。@JohnBollinger但这并不意味着什么,除非您理解ASCII/Unicode,并且所有小写字母都是连续的。@JohnBollinger先生,您能详细说明一下吗我不明白这个“a”的用法。是的。“a”对应于java中的整数97。因此,当您调用charAt(I)时,您基本上只是取整数,然后从中减去整数97。字符的整数值有很好的文档记录。非常感谢您的回答。欢迎使用StackOverflow:)关于编码的小更正。ASCII在0-127范围内,扩展为ASCII 0-255。关键是字符是unicode标准的,而不是ASCII。谢谢,我想这个答案让我大吃一惊:Java的
String
char
与ASCII或任何未指定为“扩展ASCII”的字符集无关.谢谢你的回答。
class Main {
    public static void main(String[] args) {
        String s = "snuffleupagus";
        int[] arr = new int[26];

        for (int i = 0; i < s.length(); i++) {
            arr[s.charAt(i)-'a']++;
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.println((char)(i + 'a') + ": " + arr[i]);
        }
    }
}