这段代码 ++array[s.charAt(i) - 'A'] 到底是做什么的?

8
for (int i = 0; i < s.length(); ++i) 
    {
        if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') 
        {
            ++array[s.charAt(i) - 'A'];
        }
    }

我理解For循环。s.length()的长度为26,准确地说是int[26]。因此该循环将发生26次,即0-25。如果i处的Char在A-Z之间或恰好等于这些字符之一,则会继续执行++array[s.charAt(i) - 'A'];。从我看到的情况来看,它每次循环都会添加一次数组,或者每次循环都会给char i的String添加一次数组值,因此第一个值为0,第二个值为2,因为数组从0开始。因此,在位置i-'A'添加一个数组就让我感到困惑。

5个回答

22

这个语句 ++array[s.charAt(i) - 'A']; 是在递增数组的值,该数组的索引是由 s.charAt(i) - 'A' 确定。

这个循环的作用是计算字符串 s 中每个字母出现的次数。

减去 'A' 的原因是为了“平移”ASCII/Unicode值,使得 A - Z 有值 0 - 25,更适合作为数组索引。


20

array 似乎是一个"每个大写字母的计数器"。通过从字符串中任意字符中减去字符'A',可以得到该字母在数组中的索引:

'A' - 'A' == 0
'B' - 'A' == 1
'C' - 'A' == 2
为了理解这个问题,你需要知道Java对待char的方式与(unsigned) short相同。因此,你可以使用char进行计算。

2
"count[str.charAt(i)]++" 实际上存储了什么?[重复] 对于那些有相同相关问题的人,这里是答案。
第一:
static final int chars=256; static char count[]=new char[chars];
当我们将这段代码转换成图像时,它就变成了这样:
0 1 2 3 4 5 6 7 8 9 .. .. .. .. .. .. .. 97 .. 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
第二:
count[str.charAt(i)]++;
假设您有str = "abc" 那么 str.charAt(0) 将是 "a" 然后 count['a'] 意味着 count[97],为什么?因为Java自动将 'a' 转换为 ASCII 码数字 97; 然后 count[97] 的值为 0,当您像这样增加它 count[97]++ 时,它将变为 1。
如果您再次递增它,如 count[97]++,则它将变为 2。
这就是整个秘密。我不描述其他内容,因为我认为您的问题已经得到了回答。 如果您想测试我所说的是否正确,请使用此简单代码进行检查。 public static void main(String[] argv) {
 int[] count = new int[255]; 
    count['a']++;
    System.out.println(count['a']);
    int counter=0;
    for(int i=0;i<count.length;i++) {
        System.out.println(counter++ + " " + count[i]);
    }

}


1
++array[s.charAt(i) - 'A'];

统计给定字符串s中每个字符的频率,并将每个字符的频率存储在数组的特定索引处。

1

计算字符数

(计算字符数不是历史人物)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接