在 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();