3 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
因此,下面的代碼將迭代 a 中的每個(gè)字符String,并根據(jù)字符的數(shù)值,由cameron1024 answer's解釋?zhuān)黾右粋€(gè)計(jì)數(shù)器。
for (int i = 0; i < str.length(); i++)
{ //System.out.println(count[str.charAt(i)]+" Before");
count[str.charAt(i)]++;
// System.out.println(count[str.charAt(i)]+" After");
}
好吧,理論上是因?yàn)槟枰聰?shù)組以正確遞增:
count[str.charAt(i)] = count[str.charAt(i)]++;
//Same as
char tmp = count[str.charAt(i)];
count[str.charAt(i)] + 1;
count[str.charAt(i)] = tmp;
但也要使用正確的增量運(yùn)算符,因?yàn)樗鼤?huì)返回原始值而不是結(jié)果
count[str.charAt(i)] = ++count[str.charAt(i)];
//Same as
count[str.charAt(i)] = count[str.charAt(i)] + 1;
當(dāng)然,你可以簡(jiǎn)化
for (int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
count[c] = ++count[c];
}
甚至更好
for( char c : str.toCharArray())
{
count[c] = ++count[c];
}

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
根據(jù) Oracle 的文檔:
char 數(shù)據(jù)類(lèi)型是單個(gè) 16 位 Unicode 字符。它的最小值為 > >'\u0000'(或 0),最大值為 '\uffff'(或 65,535)。
為此,您可以將其視為 16 位無(wú)符號(hào)(即正)整數(shù)。因此,代碼char c = 1;
等價(jià)于char c = (int) 1;
,由于Java在類(lèi)型之間的自動(dòng)轉(zhuǎn)換。這類(lèi)似于 how?long l = 1;
,盡管1
它是整數(shù)原語(yǔ),因?yàn)?Java 語(yǔ)言理解您可能想要一個(gè)long
而不是int
.
因此,count[i] == 1
它的行為就像您將 is 定義為一個(gè)int[]
,并檢查該索引處字節(jié)的數(shù)值以查看它們是否相等1
;
相反,如果您嘗試檢查該索引是否包含字符1,您可以嘗試count[i] == '1';
(注意單引號(hào),用于字符文字而不是字符串文字)。

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
兩字節(jié)char
可以擴(kuò)展為四字節(jié)int
。(char)('a' + 1) == 'b'
和'a' == 97
。
char
(一個(gè) 2 字節(jié)的 UTF16 值)已用作索引 (count[str.charAt(i)]
),將其擴(kuò)展為 65_535 (0xFFFF) 的 0 之間的一個(gè)整數(shù)。char
也被用于char[] count
從 0 到 65_535 的計(jì)數(shù) ( )。
所以有兩個(gè)限制:
特殊字符很容易超過(guò)數(shù)組長(zhǎng)度:
€
0x20AC、‘
0x2018 和’
0x2019。如果
str
包含超過(guò) 65_535 個(gè)相同字符,則計(jì)數(shù)溢出。
該算法將更清晰:
Map<Character, Integer> count = str.chars() .mapToObj(char.class::cast) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
看起來(lái)好像在 C/C++ 中char
被假定byte
為歷史上的 a 。然而,java 旨在處理字符串中的完整 Unicode,并且char
是 UTF-16BE 格式的兩個(gè)字節(jié)。所以java可以同時(shí)持有多個(gè)腳本。
計(jì)數(shù)[str.charAt(i)]++;
int j = (int')str.charAt(i); count[j] = ((int)count[j]) + 1;
計(jì)數(shù)[str.charAt(i)] == 1
char ch = count[j]; (int)ch == 1
添加回答
舉報(bào)