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条经验 获得超4个赞
两字节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
添加回答
举报