char数组是穷人的字典吗?

Is char array a poor man's dictionary?

我是“自学成才”的,所以有时我很难理解一些概念。

所以假设在 C#/Java 中我有一个 char 数组。我还有一个单独的 int 数组。

我不明白的是我的 char 和 int 数组如何以及为什么足够“智能”,以至于当我迭代 char 时,我可以通过递增更新观察到的字符的计数,就像它是某种字典一样?

为什么会这样?

对不起我的措辞,我不知道如何准确解释这让我感到多么困惑。

除了比较字符串以进行排列之外,我还能将它用于哪些其他好的用途?

public static bool isPermutation(string s1, string s2)
    {
        if (s1.Length != s2.Length)
        {
            return false;
        }

        int[] letters = new int[128];

        var first = s1.ToCharArray();
        var second = s2.ToCharArray();


        foreach (int c in first)
        {
            Console.WriteLine(c);
            Console.WriteLine(letters[c]);
            letters[c]++;
        }
//etc...

What I don't get is how and why are my char and int arrays "smart" enough so that when I iterate over chars I can update the count of observed characters with incrementing, like it's some sort of dictionary?

您是在问为什么对数组进行迭代?这是一个非常基本的概念,你有一个数组,你迭代它。

这与字典无关。事实上,字典根本不是可迭代的(以一种稳定的方式),Dictionary<> class 将元素存储在一个内部列表中以允许迭代,这就是为什么字典是相对胖的对象。

字典是一组“键”和“值”(任意类型)。您使用键查找相应的值。

数组有一个 'index' 和一个“值”。它们不一样,但它们都存储值集合,只是方式非常不同。

在您的代码中,您正在为每个基本的 128 个 ascii 字符创建一个数组。如果您不知道,您计算机上的所有数据都是以位(1 和 0)存储的,这些数字也用于表示 letters/characters

('#' = 35;.. '3' = 51; ... 'A'=65; 'B' = 66; ... 'a' = 97; 'b' = 98, ... '~' = 126)

当你说:

foreach (int c in first)

您正在将 char 转换为整数值。因此,当您在第一个字符串中找到 'A' 时,您将在索引 65 处递增数组中的值。这样您就可以使用字符的值来 look-up 数组中的索引递增。

所以您所拥有的是一种有效的方法来跟踪您看到的每个字符的数量,但它不是字典。您从每个可能的字符的占位符开始,而不是在您第一次遇到它们时将元素添加到字典中。