这个问题在这里已有答案:
我正在阅读一段我无法理解的代码。考虑与我们的社区检查这一点。
在下面的代码中,我无法理解行计数[ch-'a'] ++的作用。或者我们如何在java 7中编写相同的内容。解释说的是我们有一个String和一个int数组。我们遍历字符串s并计算s中字符出现的次数,并将count的频率放入数组中。请帮忙!!
String s = "test";
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
count[ch-'a']++;
}
您正在迭代一个整数count
数组并在索引ch-'a'
处递增整数值,这会产生一个整数值,例如count['a'-'a'] == count[0]
来标记该字符存在于字符串中。
你在ch - 'a'
中减去因为字母字符的整数值不是从0开始。
代码试图计算每个字符的出现次数。
并且它分配它
a occupies position 0
b occupies position 1
etc etc
要获得位置0,你需要调用'a' - 'a' 获得位置1,你需要调用'b' - 'a'
那么“count [ch-'a'] ++中发生了什么;”相当于
int position = ch -'a'; // get position
count[position] = count [position] + 1; // increment the count in that particular position
它意味着将两个字符视为整数并从另一个中减去一个。例如,
'b' - 'a' == 1
在您发布的代码中,它将所有小写字符计数到数组数据结构中。换句话说,如果String中有许多小写的'a',则count [0]将非常大,如果许多lowecase'b等,count [1]将会很大,等等。
count[]
在这里存储来自String
的每个字母的出现作为参数传递(在count[0]
将存储'a
'的出现次数,在count[1]
出现'b
'的数量,...在count[25]
出现的'z
') 。
现在在以下行中:
char ch = s.charAt(i);
您存储来自给定String的当前已检查字符。 (当i = 0
,它是't
')。请记住,每个char
都可以表示为int
(它是ASCII码)。要查看与每个char
对应的所有数值的列表,可以在Internet中搜索ASCII表(例如,here,在“Dec”列)。所以't
'是116。
说:
count[ch-'a']++;
你的意思是count[116 - 97]++
,它是count[19]++
。通过'a
'减去减去97,它可以帮助您快速找到数组中的索引,在该数组中存储当前已检查的char ch
。看看,对于'a
',它将是count['a' - 'a']
(count[0]
- count
数组中的第一个索引),'z
'count[122 - 97]
(count[25]
- count
数组中的最后一个索引)