你能帮我理解这段 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;
我对这里的一些事情感到困惑。 ++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;