3 回答
TA贡献1789条经验 获得超10个赞
因此,下面的代码将迭代 a 中的每个字符String,并根据字符的数值,由cameron1024 answer's解释,增加一个计数器。
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");
}
好吧,理论上是因为您需要更新数组以正确递增:
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个赞
根据 Oracle 的文档:
char 数据类型是单个 16 位 Unicode 字符。它的最小值为 > >'\u0000'(或 0),最大值为 '\uffff'(或 65,535)。
为此,您可以将其视为 16 位无符号(即正)整数。因此,代码char c = 1;等价于char c = (int) 1;,由于Java在类型之间的自动转换。这类似于 how long l = 1;,尽管1它是整数原语,因为 Java 语言理解您可能想要一个long而不是int.
因此,count[i] == 1它的行为就像您将 is 定义为一个int[],并检查该索引处字节的数值以查看它们是否相等1;
相反,如果您尝试检查该索引是否包含字符1,您可以尝试count[i] == '1';(注意单引号,用于字符文字而不是字符串文字)。
TA贡献1783条经验 获得超5个赞
两字节char可以扩展为四字节int。(char)('a' + 1) == 'b'和'a' == 97。
char(一个 2 字节的 UTF16 值)已用作索引 (count[str.charAt(i)]),将其扩展为 65_535 (0xFFFF) 的 0 之间的一个整数。char也被用于char[] count从 0 到 65_535 的计数 ( )。
所以有两个限制:
特殊字符很容易超过数组长度:
€0x20AC、‘0x2018 和’0x2019。如果
str包含超过 65_535 个相同字符,则计数溢出。
该算法将更清晰:
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 格式的两个字节。所以java可以同时持有多个脚本。
计数[str.charAt(i)]++;
int j = (int')str.charAt(i); count[j] = ((int)count[j]) + 1;
计数[str.charAt(i)] == 1
char ch = count[j]; (int)ch == 1
添加回答
举报
