字符数组如何存储字符以及每个字符的数量?

时间:2013-06-30 09:04:40

标签: 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 ++?

在这里的最后一行,它增加了字符A的数量,而不是将它增加一个字符'B'。我知道不应该这样做。但我想知道它是如何存储每个字符及其计数在这里,当仅用于++运算符而不是通过执行chArr [ch] = chArr [ch] + 1时也是如此;

我理解这一点,因为它是围绕字谜的许多算法的基础。

1 个答案:

答案 0 :(得分:3)

执行chArr[ch]++时,它会增加数组中索引ch的值。

由于chArr[]包含字符,因此这会将字符按顺序递增为下一个字符 - 因此它会将'A'转换为'B',或'B'转换为{ {1}}等等。例如,如果'C'的值为65,则向其中添加一个将使其为66,这是'A'的字符代码。

(你的例子是你在代码为0的字符(nul字符)中加1,这将产生代码为1的字符(SOH或“头部开头”字符),但原则是无论实际的字符代码如何都一样。)

理论上你可以使用它来计算字符出现的次数(达到一定的限制),因为你可以通过适当的强制转换将字符视为一个计数数字 - 但这将是这是一个糟糕的方式;你不应该将字符视为计数数字。

这不编译:

'B'

因为chArr[ch] = chArr[ch] + 1; 被转换为chArr[ch] + 1来执行算术,然后无法将其放回到char数组中。

可是:

int

在执行增量时不会将char转换为int,因此编译好。

请注意,以下行编译好,因为我们将chArr[ch]++ 结果转换回int,然后将其放入char数组中:

char

另请注意,chArr[ch] = (char)(chArr[ch] + 1); 等同于执行上述操作,这就是编译的原因。

编译器理解它需要将结果视为与数组相同的类型,因此它看起来好像是为你执行转换。

你真的想做什么?

如果您的目标是计算每个字符的出现次数,则应使用chArr[ch]++数组,因为您对计数感兴趣。你想要完成什么?

<强>附录

如果你确实想要计算某些文本中所有字符的出现次数,一种好方法是使用int,其中每个字符映射到整数计数。计数后,如果字典中没有出现字符,则表示字符串中没有出现该字符。

代码如下所示:

Dictionary<char, int>