1.
哈希表(HashTable)又叫做散列表,根据关键码值(即键值对)而直接访问的数据结构。
2. Add 方法
为了给集合添加成员,Add 方法需要首先检查来确保成员不在集合内。如果成员在集合内,那么什么操作也不
做。如果成员不在集合内,则把它添加到散列表中。
publicvoid Add(Object item)
{
if (!data.ContainsValue(item))
data.Add(Hash(item), item);
}
既然数据项必须作为键值对添加到散列表中,所以通过添加要加入到集合内的数据项字符的 ASCII 码值的方法
就可以计算散列值。下面是 Hash 方法:
privatestring Hash(Object item)
{
char[] chars;
string s = item.ToString();
int hashValue = 0;
chars = s.ToCharArray();
for (int i = 0; i <= chars.GetUpperBound(0); i++)
hashValue += (int)chars[i];
return hashValue.ToString();
}
3. Remove 方法和 Size 方法
当然,这里需要能把成员从集合内移除掉的方法,还需要确定集合内成员数量(多少)的方法。下面就是简单
明了的方法:
//这是移除的方法
publicvoid Remove(Object item)
{
data.Remove(Hash(item));
}
//确定数量多少的方法
publicint Size()
{
return data.Count;
}
4. Union 方法
Union 方法会把两个集合合并。这个方法首先会通过添加第一个集合全部成员的方式来构建一个新的集合。然后,方法会检查第二个集合内的每一个成员从而确定这些成员是否已经
在第一个集合内。如果检查的成员在第一个集合内,那么就会跳过这个成员,反之则会把这个成员添加到新集合内。
public CSet Union(CSet aSet)
{
CSet tempSet = new CSet();
foreach (Object hashObject in data.Keys)
tempSet.Add(this.data[hashObject]);
foreach (Object hashObject in aSet.data.Keys)
if (!(this.data.ContainsKey(hashObject)))
tempSet.Add(aSet.data[hashObject]);
return tempSet;
}
5. Intersection 方法
Intersection 方法循环遍历集合的关键字,并且检查是否会在传递的集合内找到该关键字。如果找到,就把该成
员添加到新集合内并且跳过其他操作。
public CSet Intersection(CSet aSet)
{
CSet tempSet = new CSet();
foreach (Object hashObject in data.Keys)
if (aSet.data.Contains(hashObject))
tempSet.Add(aSet.data[hashObject]);
tempSet.Add(aSet.GetValue(hashObject))
return tempSet;
}
6. Subset 方法
一个集合是另一个集合子集的第一要素就是该集合在尺寸上必须小于第二个集合。Subset 方法会首先检查集合
的大小,如果第一个集合合格,再接着检查第一个集合的每一个成员是否是第二个集合的成员。代码如下所示:
publicbool Subset(CSet aSet)
{
if (this.Size() > aSet.Size())
returnfalse;
else
foreach (Object key inthis.data.Keys)
if (!(aSet.data.Contains(key)))
returnfalse;
returntrue;
}
7. Difference 方法
这里已经讨论过如何获得两个集合的差异。为了执行此推算,方法会循环遍历第一个集合的关键字,并且寻找
与第二个集合匹配的任何内容。如果成员存在于第一个集合内而又没有在第二个集合内找到的话,就把此成员添加
到新集合内。下面就是代码(连同 ToString 方法一起):
public CSet Difference(CSet aSet)
{
CSet tempSet = new CSet();
foreach (Object hashObject in data.Keys) if (!(aSet.data.Contains(hashObject)))
tempSet.Add(data[hashObject]);
return tempSet;
}
publicoverridestring ToString()
{
string s = “”;
foreach (Object key in data.Keys)
s += data[key] + "";
return s;
}