前言:
对于Hashtable在我的上篇博客中有提到,是用在了事务处理中,向sqlhelper传递参数,这个用的很巧妙不知道大家有没有进一步的研究,但是为什么现在需要用到Hashtable的排序呢。大家跟着我想这样的一个场景,现在需要注册一个新用户,注册用户的时候需要有如下的业务逻辑:每个用户拥有或多张卡,注册用户的时候需要对卡进行一定金额的充值。
一、业务表分析:
对于这个业务逻辑我们建立的关系表需要有三张,1.用户信息表,用于保存用户的基本信息;2.卡信息表,用于保存卡的基本信息;3.充值记录表,用于保存充值记录信息。当然考虑数据库建立的三范式,我们还需要保证这三张表具有主外键的关系。用一张数据库关系图来表示:
二、与事务机制的联系:
当然我们会想到这“三件”事必须同时完成或同时不完成,他们的这种关系就组成了一个事务操作,而这个要求即事务的原子性。
三、为什么要对Hashtable排序:
要实现这样的需求,还需要满足的操作要求:三张表的插入顺序是:用户表——卡表——充值表。
对于Hashtable有一定了解的人都知道Hashtable的一个重要的特点就是排序无序的。
对于这个无序的说明有这样的一个例子:
publicstaticvoidMain()
{
Hashtableht=newHashtable();
ht.Add("key1","value1");
ht.Add("key2","value2");
ht.Add("key3","value3");
ht.Add("key4","value4");
ht.Add("key5","value5");
foreach(stringstrinht.Keys)
{
Console.WriteLine(str+":"+ht[str]);
}
}
运行的结果:
通过这个小例子就可以理解了哈希表的无序性。那我们怎么保证程序按照我们想要的顺序在sqlhelper中逐个的执行呢。(这个执行的代码看上篇博客)我们就需要Hashtable进行排序了。
四、排序的方法:
这里我主要给大家介绍3种方法:
1.我按什么顺序加进去就按什么顺序输出:
publicclassNoSortHashTable:Hashtable
{
privateArrayListlist=newArrayList();
publicoverridevoidAdd(objectkey,objectvalue)
{
base.Add(key,value);
list.Add(key);
}
publicoverridevoidClear()
{
base.Clear();
list.Clear();
}
publicoverridevoidRemove(objectkey)
{
base.Remove(key);
list.Remove(key);
}
publicoverrideICollectionKeys
{
get
{
returnlist;
}
}
}
这里注意:ArrayList是不排序的(添加的顺序就是输出的顺序)。让它和hashtable结合不就实现这种功能的吗?这样继承了Hashtable具有Hashtable的丰富功能,又满足ArrayList不排序的功能。满足我们的要求。
publicstaticvoidMain()
{
NoSortHashTableht=newNoSortHashTable();
ht.Add("key1","value1");
ht.Add("key2","value2");
ht.Add("key3","value3");
ht.Add("key4","value4");
ht.Add("key5","value5");
foreach(stringstrinht.Keys)
{
Console.WriteLine(str+":"+ht[str]);
}
}
这样一运行就满足我的要求了:
成功了!
2.我按Hashtable中键的大小顺序进行排序
实际上是按照每一个字符的ASCII的值就行排序的。从左到右比较每个字符的Ascii的值,直到满足两个字符的ASCII的值不同即停止比较
publicstaticvoidMain()
{
Hashtableht=newHashtable();
ht.Add("ee","value1");
ht.Add("dd","value2");
ht.Add("cc","value3");
ht.Add("bb","value4");
ht.Add("aa","value5");
ArrayListlist=newArrayList(ht.Keys);
list.Sort();
foreach(stringstrinlist)
{
Console.WriteLine(str+":"+ht[str]);
}
}
运行效果:
成功了!
3.我按Hashtable中的值得大小就行排序
原理同上:实际上是按照每一个字符的ASCII的值就行排序的。从左到右比较每个字符的Ascii的值,直到满足两个字符的ASCII的值不同即停止比较
publicstaticvoidMain()
{
Hashtableht=newHashtable();
ht.Add("a","3");
ht.Add("b","4");
ht.Add("c","2");
ht.Add("d","1");
ArrayListlist=newArrayList(ht.Values);
list.Sort();
foreach(stringsvalueinlist)
{
IDictionaryEnumeratoride=ht.GetEnumerator();
while(ide.MoveNext())
{
if(ide.Value.ToString()==svalue)
{
Console.WriteLine(ide.Key+":"+svalue);
}
}
}
}
运行效果:
成功了!
五、总结:
针对第二,第三,我们可以看出来了通过下面的这个方法把Hashtable的键(keys)或值(values)转换成Arraylist.
ArrayListlist=newArrayList(ht.Values);
ArrayListlist=newArrayList(ht.Keys);
这样就可以把Hashtable的排序转换成ArrayList的排序了!
另外ArrayList提供的很多方法排序:
ArrayList.Sort()-------------------按字符的Ascii的值排序
ArrayList.Reverse()---------------反转数组
等还多ArrayList方法。如果都不满足你要的排序功能的话,那就自己针对ArrayList这个数组写算法就能对ArrayList排序,ArrayList排序也就完成了Hashtable的排序。
六、重点说明:
另外,需要说明一点,上面的排序是不严谨的,有值相等时会有重复输出。
例如:
publicstaticvoidMain()
{
Hashtable hs = new Hashtable();
hs.Add(5, 40);
hs.Add(4, 20);
hs.Add(3, 20);
hs.Add(2, 15);
hs.Add(1, 5);
ArrayList als = new ArrayList(hs.Values);
als.Sort();
foreach (object ob in als)
{
IDictionaryEnumerator ide = hs.GetEnumerator();
while (ide.MoveNext())
{
if (ide.Value.ToString() == ob.ToString())
Console.WriteLine(ide.Key.ToString() + ":" + ob.ToString());
}
}
}
运行结果为:
引起这个问题主要是那hashtable中允许有重复的值引起的。如果要想解决这个问题的话,在转换成ArrayList时候需要把重复的value去掉。(key不允许重复就不会出现)
可以将程序改为:
publicstaticvoidMain()
{
Hashtable ht = new Hashtable();
ht.Add(5, 40);
ht.Add(4, 20);
ht.Add(3, 20);
ht.Add(2, 15);
ht.Add(1, 5);
ArrayList listTemp = new ArrayList(ht.Values);
ArrayList list = new ArrayList();
foreach (object value in listTemp)
{
if (!list.Contains(value))
{
list.Add(value);
}
}
list.Sort();
foreach (object obj in list)
{
IDictionaryEnumerator ide = ht.GetEnumerator();
while (ide.MoveNext())
{
if (ide.Value.ToString() == obj.ToString())
{
Console.WriteLine(ide.Key.ToString() + ":" + obj.ToString());
}
}
}
}
运行结果为:
成功了!
分享到:
相关推荐
实现hashtable按值排序和按key排序,可直接运行
HashTable排序,大家可以学习学习..很有帮助 的呀
1C#HASHTABLE排序.pdf
HashTable源码
WinFormHashTable最简单用法,.net hashtable ,hashtable ,hashtable用法
开源项目-spion-hashtable-latencies.zip,Improved latency in Go's next version (1.8) at spion/hashtable-latencies
自己写的json字符串转hashtable,或者把hashtable转为json字符
Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结
主要介绍了C#中哈希表(HashTable)用法,简单讲述了哈希表的原理并结合实例形式详细分析了C#针对哈希表进行添加、移除、判断、遍历、排序等操作的实现技巧,需要的朋友可以参考下
HashTable SortHashTable SortHashTable Sort
记得刚毕业那会准备面试,看过不少面试题,里面有个说出HashMap和HashTable不同的题目,我那会面试的时候也遇到不少次这个问题,还隐约记得当时的回答是这样的: HashTable是比较旧的版本;HashTable是线程安全的,...
Hashtable类的操作。Hashtable是Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值...
利用asp.net遍历hashtable中的值
初级程序员面试经常问道的问题,HashMap与HashTable区别,希望有帮助
C#之Json字符串转换Hashtable,DataTable,DataSet方法和反转换方法.
java Hashtable的泛型化 java Hashtable的泛型化 java Hashtable的泛型化
hashtable和hashmap的区别
Hashtable存储数据例子,希望大家多多指教
hashMap和hashTable的区别,大家可以下载学习学习。
C/C++语言 hashtable代码 .c文件 适用于linux ubuntu unix等平台 terminal中操作