在 C# 中使用 Hashtable Class 处理碰撞
Handle Collision using Hashtable Class in c#
在下面的场景中,我如何使用哈希表 class 在 C# 中处理或实现冲突?如果 'Key' 值相同,我将得到一个 "Argument Exception"。
static void Main(string[] args)
{
Console.Write("Enter a string:");
string input = Console.ReadLine();
checkString(input);
Console.ReadLine();
}
static void checkString(string input)
{
Hashtable hashTbl = new Hashtable();
foreach(char c in input)
{
hashTbl.Add(c.GetHashCode(), c);
}
printHash(hashTbl);
}
static void printHash(Hashtable hash)
{
foreach(int key in hash.Keys)
{
Console.WriteLine("Key: {0} Value: {1}",key,hash[key]);
}
}
我的期望:
我需要在 'Value' 参数中做什么才能解决 'Collision' 问题。我正在尝试检查字符串是否包含唯一字符。
您似乎误解了 Hashtable class 的工作原理(自 2005 年以来它已被弃用 - 使用 Dictionary<K,V>
代替,但它在这里的行为是相同的)。
您似乎希望您的工作是获取对象的哈希码并将其添加到哈希表中。它不是。您需要做的就是添加您要用作键(每个字符)的对象,内部实现将提取哈希码。
但是,即使您自己添加了键对象,您实际所做的也不会起作用。您正在获取一个输入字符串(例如,"test"),并且对于每个字符,您都将其作为键添加到哈希表中。但是,根据定义,由于键是唯一的,因此您将添加字符 't' 两次(它在输入中出现两次),因此您将得到一个例外。
如前所述,您可能应该为此切换到 Dictionary<TKey, TValue>
class。
如果你想解决冲突问题,那么你必须检查密钥是否存在。
Dictionary<string, object> dictValues = new Dictionary<string, object>();
然后你可以使用碰撞检查:
if (dictValues.ContainsKey(YourKey))
{
/* ... your collission handling here ... */
}
else
{
// No collission
}
另一种可能性是,如果您对保留同一键的先前值不感兴趣:
dictValues[YourKey] = YourValue;
如果密钥条目不存在,这将添加它。如果是,它将用给定的输入覆盖它的值。
I am trying to check if the string consists of unique characters.
然后你只需要键而不需要值,这就是 HashSet<T>
的目的。
var chars = new HashSet<char>();
foreach (char c in input)
{
if (chars.Contains(c))
{
// c is not unique
}
else
{
chars.Add(c);
}
}
但在这种情况下我更喜欢使用 LINQ:
var hasUniqueChars = input.Length == input.Distinct().Count();
在下面的场景中,我如何使用哈希表 class 在 C# 中处理或实现冲突?如果 'Key' 值相同,我将得到一个 "Argument Exception"。
static void Main(string[] args)
{
Console.Write("Enter a string:");
string input = Console.ReadLine();
checkString(input);
Console.ReadLine();
}
static void checkString(string input)
{
Hashtable hashTbl = new Hashtable();
foreach(char c in input)
{
hashTbl.Add(c.GetHashCode(), c);
}
printHash(hashTbl);
}
static void printHash(Hashtable hash)
{
foreach(int key in hash.Keys)
{
Console.WriteLine("Key: {0} Value: {1}",key,hash[key]);
}
}
我的期望: 我需要在 'Value' 参数中做什么才能解决 'Collision' 问题。我正在尝试检查字符串是否包含唯一字符。
您似乎误解了 Hashtable class 的工作原理(自 2005 年以来它已被弃用 - 使用 Dictionary<K,V>
代替,但它在这里的行为是相同的)。
您似乎希望您的工作是获取对象的哈希码并将其添加到哈希表中。它不是。您需要做的就是添加您要用作键(每个字符)的对象,内部实现将提取哈希码。
但是,即使您自己添加了键对象,您实际所做的也不会起作用。您正在获取一个输入字符串(例如,"test"),并且对于每个字符,您都将其作为键添加到哈希表中。但是,根据定义,由于键是唯一的,因此您将添加字符 't' 两次(它在输入中出现两次),因此您将得到一个例外。
如前所述,您可能应该为此切换到 Dictionary<TKey, TValue>
class。
如果你想解决冲突问题,那么你必须检查密钥是否存在。
Dictionary<string, object> dictValues = new Dictionary<string, object>();
然后你可以使用碰撞检查:
if (dictValues.ContainsKey(YourKey))
{
/* ... your collission handling here ... */
}
else
{
// No collission
}
另一种可能性是,如果您对保留同一键的先前值不感兴趣:
dictValues[YourKey] = YourValue;
如果密钥条目不存在,这将添加它。如果是,它将用给定的输入覆盖它的值。
I am trying to check if the string consists of unique characters.
然后你只需要键而不需要值,这就是 HashSet<T>
的目的。
var chars = new HashSet<char>();
foreach (char c in input)
{
if (chars.Contains(c))
{
// c is not unique
}
else
{
chars.Add(c);
}
}
但在这种情况下我更喜欢使用 LINQ:
var hasUniqueChars = input.Length == input.Distinct().Count();