你能帮我理解这段 Java 代码吗?

Are you able to help me understand this Java code?

我对这里的一些事情感到困惑。 ++alpha/--alpha和数组里面的[c - 'a']。我 运行 它通过调试,我注意到一个 1 被存储。但我不明白为什么会这样,以及 - 'a' 在做什么。

boolean test = true;
String r = "aa";
String m = "baab";
int[] alpha = new int[26];
        
for(char c: m.toCharArray())
   ++alpha[c - 'a'];
        
for(char c: r.toCharArray()){
   if(alpha[c - 'a'] != 0)
        --alpha[c - 'a'];
   else
        test = false;
}
System.out.print(test);

代码统计字符个数,充分利用了char可以转换为整数,用在长度为26个字符的数组int[] alpha = new int[26];中对应字母表中的字母,并且需要最少的代码来做到这一点。

简而言之,只要在 m 字符串中找到相应的字符,下面的代码就会将 +++1 添加到数组中:

for(char c: m.toCharArray())
   ++alpha[c - 'a'];

而第二个循环只要在 r 字符串中找到相应的字符,就简单地从数组中减去 ---1

for(char c: r.toCharArray())
   if(alpha[c - 'a'] != 0)
        --alpha[c - 'a'];

更详细:

++-- 只是简单地递增或递减关联变量,将它放在变量之前 ++alpha[x] 只是意味着它将执行操作然后分配增加的值而不是如果它在 alpha[x]++ 之后,则相反,但是,这在这个代码示例中没有区别:

例如以下代码:

alpha[0] = 0;
++alpha[0]; //or alpha[0]++;
System.out.println("The value was: " + alpha[0]);

我们得到这个结果:

The value was: 1

至于[c - 'a'],例如'a'char的值实际上是97,我们可以通过System.out.println((int)'a');看到,这很有用,因为它意味着在某些情况下我们可以直接使用 char 变量而不是整数来编写更少的代码。所以它实际上只是 [c - 97],但是,如果我们在上下文中查看它,我们可以看到 c 也是 m 字符串中的一个字符,因此对于第一个字符,我们得到:

String m = "baab";
for(char c: m.toCharArray()){
    ++alpha[c - 'a'];

c 在循环的第一次迭代中等于 'b',如下所示:

    ++alpha['b' - 'a'];

但我们知道 char 的行为类似于整数,其中 a=97 和 b=98 如下所示:

    ++alpha[98 - 97];

对于循环中的第一个字符 'b',它实际上最终导致:

++alpha[1];//98-97=1

如果我们现在展开 ++,它看起来像这样:

alpha[1] = alpha[1] + 1;

例如,如果字符是 z,它将以相同的方式工作,其中 ['z'-'a'][122-97] 相同,后者等于 [25]:

alpha['z'-'a'] = alpha['z'-'a'] + 1;

//which is the same as
alpha[122-97] = alpha[122-97] + 1;

//which equates to
alpha[25] = alpha[25] + 1;