C# 字符数组如何存储字符以及每个字符的计数?
这是我的代码,它有一个字符数组和字符变量C# 字符数组如何存储字符以及每个字符的计数?,c#,algorithm,C#,Algorithm,这是我的代码,它有一个字符数组和字符变量 char[] chArr = new char[1000]; char ch='A'; chArr[0]= 'D'; //chArr[ch] = chArr[ch] + 1; //fails to compile chArr[ch]++ ; //works. But how can it store character and its count that too only with ++? 在这里的最后一行中,
char[] chArr = new char[1000];
char ch='A';
chArr[0]= 'D';
//chArr[ch] = chArr[ch] + 1; //fails to compile
chArr[ch]++ ; //works. But how can it store character and its count that too only with ++?
在这里的最后一行中,它增加了字符A的计数,而不是增加一个字符“B”。虽然我知道它不应该这样做。但我想了解它是如何在这里存储每个字符及其计数的,当它仅与++运算符一起使用时,而不是通过执行chArr[ch]=chArr[ch]+1
我理解这一点,因为它是许多关于字谜的算法的基础。当你做
chArr[ch]++
时,它会增加数组中索引ch
处的值
由于chArr[]
包含字符,因此这将增加字符,使其成为序列中的下一个字符-因此它将'A'
转换为'B'
,或'B'
转换为'C'
,依此类推。例如,如果'A'
的值为65,则向其中添加一个值将使其成为66,这是'B'
的字符代码
(您的示例是将1添加到代码为0的字符(nul字符),这将生成代码为1的字符(SOH或“标题开头”字符),但无论实际字符代码如何,原则都是相同的。)
理论上,你可以用它来计算角色出现的次数(达到一定的限制),因为你可以用适当的施法将角色视为一个计数数字,但这是一个不好的方法;你不应该把字符当作计数
这不会编译:
chArr[ch] = chArr[ch] + 1;
因为chArr[ch]+1
被转换成一个int
来做算术运算,然后不能把它放回char数组中
但是:
在执行递增操作时,不会将字符转换为int,因此它编译为ok
请注意,以下行将编译为OK,因为我们将int
结果转换回char
,然后再将其放入char数组中:
chArr[ch] = (char)(chArr[ch] + 1);
还要注意,chArr[ch]++
相当于执行上述操作,这就是它编译的原因
编译器理解,它需要将结果视为与数组相同的类型,以便它看起来像是为您执行强制转换
你真正想做什么?
如果您的目标是统计每个字符的出现次数,那么应该使用int
数组,因为您对计数感兴趣。你想完成什么
附录
如果确实要计算某个文本中所有字符的出现次数,一个好方法是使用字典,其中每个字符映射到整数计数。计数后,如果某个字符未出现在字典中,则表示该字符未出现在字符串中
代码如下所示:
string testString = "The owls are not what they seem.";
var counts = new Dictionary<char, int>();
foreach (var ch in testString)
{
if (!counts.ContainsKey(ch))
counts.Add(ch, 0);
++counts[ch];
}
foreach (var count in counts)
Console.WriteLine("{0}: {1} times.", count.Key, count.Value);
string testString=“猫头鹰不是它们看上去的样子。”;
var counts=新字典();
foreach(testString中的var ch)
{
如果(!counts.ContainsKey(ch))
计数。添加(ch,0);
++计数[ch];
}
foreach(计数中的变量计数)
WriteLine(“{0}:{1}次。”,count.Key,count.Value);
执行chArr[ch]+
操作时,它会增加数组中索引ch
处的值
由于chArr[]
包含字符,因此这将增加字符,使其成为序列中的下一个字符-因此它将'A'
转换为'B'
,或'B'
转换为'C'
,依此类推。例如,如果'A'
的值为65,则向其中添加一个值将使其成为66,这是'B'
的字符代码
(您的示例是将1添加到代码为0的字符(nul字符),这将生成代码为1的字符(SOH或“标题开头”字符),但无论实际字符代码如何,原则都是相同的。)
理论上,你可以用它来计算角色出现的次数(达到一定的限制),因为你可以用适当的施法将角色视为一个计数数字,但这是一个不好的方法;你不应该把字符当作计数
这不会编译:
chArr[ch] = chArr[ch] + 1;
因为chArr[ch]+1
被转换成一个int
来做算术运算,然后不能把它放回char数组中
但是:
在执行递增操作时,不会将字符转换为int,因此它编译为ok
请注意,以下行将编译为OK,因为我们将int
结果转换回char
,然后再将其放入char数组中:
chArr[ch] = (char)(chArr[ch] + 1);
还要注意,chArr[ch]++
相当于执行上述操作,这就是它编译的原因
编译器理解,它需要将结果视为与数组相同的类型,以便它看起来像是为您执行强制转换
你真正想做什么?
如果您的目标是统计每个字符的出现次数,那么应该使用int
数组,因为您对计数感兴趣。你想完成什么
附录
如果确实要计算某个文本中所有字符的出现次数,一个好方法是使用字典,其中每个字符映射到整数计数。计数后,如果某个字符未出现在字典中,则表示该字符未出现在字符串中
代码如下所示:
string testString = "The owls are not what they seem.";
var counts = new Dictionary<char, int>();
foreach (var ch in testString)
{
if (!counts.ContainsKey(ch))
counts.Add(ch, 0);
++counts[ch];
}
foreach (var count in counts)
Console.WriteLine("{0}: {1} times.", count.Key, count.Value);
string testString=“猫头鹰不是它们看上去的样子。”;
var counts=新字典();
foreach(testString中的var ch)
{
如果(!counts.ContainsKey(ch))
计数。添加(ch,0);
++计数[ch];
}
foreach(计数中的变量计数)
WriteLine(“{0}:{1}次。”,count.Key,count.Value);
为什么有C和C作为标记?他们对这些东西的处理非常复杂