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 数组中的索引递增。
所以您所拥有的是一种有效的方法来跟踪您看到的每个字符的数量,但它不是字典。您从每个可能的字符的占位符开始,而不是在您第一次遇到它们时将元素添加到字典中。
我是“自学成才”的,所以有时我很难理解一些概念。
所以假设在 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 数组中的索引递增。
所以您所拥有的是一种有效的方法来跟踪您看到的每个字符的数量,但它不是字典。您从每个可能的字符的占位符开始,而不是在您第一次遇到它们时将元素添加到字典中。