3 回答

TA貢獻1789條經驗 獲得超10個贊
因此,下面的代碼將迭代 a 中的每個字符String,并根據(jù)字符的數(shù)值,由cameron1024 answer's解釋,增加一個計數(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");
}
好吧,理論上是因為您需要更新數(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;
但也要使用正確的增量運算符,因為它會返回原始值而不是結果
count[str.charAt(i)] = ++count[str.charAt(i)];
//Same as
count[str.charAt(i)] = count[str.charAt(i)] + 1;
當然,你可以簡化
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貢獻1836條經驗 獲得超3個贊
根據(jù) Oracle 的文檔:
char 數(shù)據(jù)類型是單個 16 位 Unicode 字符。它的最小值為 > >'\u0000'(或 0),最大值為 '\uffff'(或 65,535)。
為此,您可以將其視為 16 位無符號(即正)整數(shù)。因此,代碼char c = 1;
等價于char c = (int) 1;
,由于Java在類型之間的自動轉換。這類似于 how?long l = 1;
,盡管1
它是整數(shù)原語,因為 Java 語言理解您可能想要一個long
而不是int
.
因此,count[i] == 1
它的行為就像您將 is 定義為一個int[]
,并檢查該索引處字節(jié)的數(shù)值以查看它們是否相等1
;
相反,如果您嘗試檢查該索引是否包含字符1,您可以嘗試count[i] == '1';
(注意單引號,用于字符文字而不是字符串文字)。

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