2 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
這段代碼為字母表中的每個(gè)字母制作了一個(gè)類似直方圖的計(jì)數(shù)器。嘗試打印'a'如下字符:
System.out.println((int)'a'); // Output: 97
每個(gè)char都有一個(gè)對(duì)應(yīng)的 Unicode 值,介于 0 和 65,535 之間。減去'a'(或,97)將字母表中的每個(gè)字母縮放到與arr數(shù)組中的“桶”相對(duì)應(yīng)的 0-26 范圍。下面是一個(gè)例子:
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)
代碼中的第二個(gè)循環(huán)檢查每個(gè)計(jì)數(shù)的奇偶校驗(yàn)以確定哪些是奇數(shù)。最后,最后的打印條件檢查字母總數(shù)是否出現(xiàn)奇數(shù)。如果這個(gè)總數(shù)0或它本身是奇數(shù),則打印"First",否則"Second"。
使用ato之外的任何字符z或大寫字母嘗試使用此代碼。它會(huì)崩潰,因?yàn)樽址?ASCII 表示超出了數(shù)組的大小,你會(huì)得到一個(gè)IndexOutOfBoundsException.
這是一個(gè)示例程序,顯示了如何構(gòu)建直方圖并通過(guò)加法將其輸出轉(zhuǎn)換回字母:
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]);
}
}
}
輸出:
a: 1
b: 0
c: 0
d: 0
e: 1
f: 2
g: 1
h: 0
i: 0
j: 0
k: 0
l: 1
m: 0
n: 1
o: 0
p: 1
q: 0
r: 0
s: 2
t: 0
u: 3
v: 0
w: 0
x: 0
y: 0
z: 0

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
arr
由大小為 26 的 int 數(shù)組組成,這也是英文字母表中的字母數(shù)。這個(gè)循環(huán)所做的就是計(jì)算字母的頻率,通過(guò)它們?cè)谧帜副碇械乃饕硎荆?code>arr[0]being 'a'
,arr[1]
being'b'
等。
它的技術(shù)細(xì)節(jié)可以簡(jiǎn)單地解釋。s.charAt(i)
正在返回char
指定位置的實(shí)例i
。char
在 Java 中,A也可以表示為一個(gè)字節(jié)。減法然后byte
從當(dāng)前字符中獲取 'a'的 ASCII 值(表示為 a )i
。所以你最終得到的是'a' - 'a' == 0
, 'b' - 'a' == 1
, 等等。
請(qǐng)注意,這可能不是計(jì)算字符的最佳方法,因?yàn)樽址赡馨牟粌H僅是小寫字母,例如大寫字母和更多符號(hào)。
添加回答
舉報(bào)