码迷,mamicode.com
首页 > 编程语言 > 详细

【转】Hashtable排序的几种方法

时间:2015-11-16 18:58:33      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

很多文章都有写到Hashtable有内部的排序机制,如果要自定义排序的话就要自己写算法来实现的:听起来很抽象,我一向喜欢简单实用的东西,我下面就来总结总结怎样来实现自定义排序Hashtable.
先看看普通的Hashtable的基本实现:

技术分享  public static void Main()
技术分享        {
技术分享            Hashtable ht = new Hashtable();
技术分享
技术分享            ht.Add("key1", "value1");
技术分享            ht.Add("key2", "value2");
技术分享            ht.Add("key3", "value3");
技术分享            ht.Add("key4", "value4");
技术分享            ht.Add("key5", "value5");
技术分享            foreach (string str in ht.Keys)
技术分享            {
技术分享                Console.WriteLine(str + ":" + ht[str]);
技术分享            }
技术分享        }


运行的结果:
技术分享
产生这个结果的原因大家都知道,Hashtable内部的排序机制使然.
下面我来说说在平时的遇到的几种排序类型以及实现:
一、我按什么顺序加进去就按什么顺序输出:

技术分享  public class NoSortHashTable : Hashtable
技术分享        {
技术分享            private ArrayList list = new ArrayList();
技术分享            public override void Add(object key, object value)
技术分享            {
技术分享                base.Add(key, value);
技术分享                list.Add(key);
技术分享            }
技术分享            public override void Clear()
技术分享            {
技术分享                base.Clear();
技术分享                list.Clear();
技术分享            }
技术分享            public override void Remove(object key)
技术分享            {
技术分享                base.Remove(key);
技术分享                list.Remove(key);
技术分享            }
技术分享            public override ICollection Keys
技术分享            {
技术分享                get
技术分享                {
技术分享                    return list;
技术分享                }
技术分享            }

这里注意:ArrayList是不排序的(添加的顺序就是输出的顺序)。让它和hashtable结合不就实现这种功能的吗?这样继承了Hashtable具有Hashtable的丰富功能,又满足ArrayList不排序的功能。满足我们的要求。

技术分享  public static void Main()
技术分享        {
技术分享            NoSortHashTable ht = new NoSortHashTable();
技术分享
技术分享            ht.Add("key1", "value1");
技术分享            ht.Add("key2", "value2");
技术分享            ht.Add("key3", "value3");
技术分享            ht.Add("key4", "value4");
技术分享            ht.Add("key5", "value5");
技术分享            foreach (string str in ht.Keys)
技术分享            {
技术分享                Console.WriteLine(str + ":" + ht[str]);
技术分享            }
技术分享        }

这样一运行就满足我的要求了:
技术分享成功了!技术分享
二、我按Hashtable中键的大小顺序进行排序
 实际上是按照每一个字符的ASCII的值就行排序的。从左到右比较每个字符的Ascii的值,直到满足两个字符的ASCII的值不同即停止比较

技术分享  public static void Main()
技术分享        {
技术分享            Hashtable ht = new Hashtable();
技术分享
技术分享            ht.Add("ee", "value1");
技术分享            ht.Add("dd", "value2");
技术分享            ht.Add("cc", "value3");
技术分享            ht.Add("bb", "value4");
技术分享            ht.Add("aa", "value5");
技术分享            ArrayList list = new ArrayList(ht.Keys);
技术分享            list.Sort();
技术分享            foreach (string str in list)
技术分享            {
技术分享                Console.WriteLine(str+":"+ht[str]);
技术分享            }
技术分享        }

运行效果:
技术分享成功了!技术分享
三,我按Hashtable中的值得大小就行排序
原理同上:实际上是按照每一个字符的ASCII的值就行排序的。从左到右比较每个字符的Ascii的值,直到满足两个字符的ASCII的值不同即停止比较 

技术分享 public static void Main()
技术分享            {
技术分享                Hashtable ht = new Hashtable();
技术分享                ht.Add("a", "3");
技术分享                ht.Add("b", "4");
技术分享                ht.Add("c", "2");
技术分享                ht.Add("d", "1");
技术分享                ArrayList list = new ArrayList(ht.Values);
技术分享                list.Sort();
技术分享                foreach (string svalue in list)
技术分享                {
技术分享                    IDictionaryEnumerator ide = ht.GetEnumerator();
技术分享                    while (ide.MoveNext())
技术分享                    {
技术分享                        if (ide.Value.ToString() == svalue)
技术分享                        {
技术分享                            Console.WriteLine(ide.Key + ":" + svalue);
技术分享                        }
技术分享                    }
技术分享                }
技术分享            }

运行效果:
技术分享成功了!技术分享
针对第二,第三,我们可以看出来了通过下面的这个方法把Hashtable的键(keys)或值(values)转换成Arraylist.

技术分享ArrayList list = new ArrayList(ht.Values);
技术分享
技术分享ArrayList list=  new ArrayList(ht.Keys);

这样就可以把Hashtable的排序转换成ArrayList的排序了!
另外ArrayList提供的很多方法排序:
ArrayList.Sort()-------------------按字符的Ascii的值排序
ArrayList.Reverse()---------------反转数组
等还多ArrayList方法。如果都不满足你要的排序功能的话,那就自己针对ArrayList这个数组写算法就能对ArrayList排序,ArrayList排序也就完成了Hashtable的排序
另外说明一点:下面这个方法还支持自定义对象类型的排序

技术分享list.Sort(IComparer comparer)

实际上这是策略模式(Strategy)在.net框架类中的体现.下面我举例说说它的用法:

1.申明一个自定义的类:

技术分享public class Eployee
技术分享    {
技术分享        public string name;
技术分享        public int age;
技术分享        public string sex;
技术分享    }

2.实例化3个对象并放进ArrayList数组中去。
由于对ArrayList数组中的对象按年龄大小进行排序。默认是不支持的。所以需要再定义一个排序的算法类实现IComparer接口,来重新定义排序的算法.也就是实现了动态的修改算法(策略模式)

技术分享public static void Main()
技术分享            {
技术分享                Eployee ep1 = new Eployee();
技术分享                ep1.name = "Charles";
技术分享                ep1.age = 21;
技术分享                ep1.sex = "男";
技术分享
技术分享                Eployee ep2 = new Eployee();
技术分享                ep2.name = "Sun";
技术分享                ep2.age = 43;
技术分享                ep2.sex = "男";
技术分享
技术分享                Eployee ep3 = new Eployee();
技术分享                ep3.name = "Sunny";
技术分享                ep3.age = 18;
技术分享                ep3.sex = "男";
技术分享
技术分享                ArrayList EmployeeList = new ArrayList();
技术分享                EmployeeList.Add(ep1);
技术分享                EmployeeList.Add(ep2);
技术分享                EmployeeList.Add(ep3);
技术分享
技术分享                EmployeeList.Sort(new myEmployeeCompare());
技术分享            }

实现IComparer接口的类MyEmployeeCompare如下:

技术分享 public class myEmployeeCompare : IComparer
技术分享    {
技术分享        IComparer Members
技术分享        }
技术分享}

这样就实现了按年龄大小从小到大进行排序。

最后说明一点:
针对Hashtable排序的特殊要求,可以先把它的键或值转化成ArrayList,针对ArrayList进行排序,进而也就实现了Hashtable的排序(上面的第二,第三就体现了这一点).毕竟ArrayList已经支持一些排序,而且还支持自定义类型的排序(Strategy),当然还可以自己写算法来实现排序.

【转】Hashtable排序的几种方法

标签:

原文地址:http://www.cnblogs.com/pp521/p/4969542.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!