马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。良多文章都有写到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]);
}
}
运转的了局:
发生这个了局的缘故原由人人都晓得,Hashtable外部的排序机制使然.
上面我来讲说在平常的碰到的几种排序范例和完成:
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]);
}
}
运转效果:
乐成了!
三,我按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的排序
别的申明一点:上面这个办法还撑持自界说工具范例的排序
list.Sort(IComparercomparer)
实践上这是战略形式(Strategy)在.net框架类中的表现.上面我举例说说它的用法:
1.声名一个自界说的类:
publicclassEployee
{
publicstringname;
publicintage;
publicstringsex;
}
2.实例化3个工具并放进ArrayList数组中往。
因为对ArrayList数组中的工具按岁数巨细举行排序。默许是不撑持的。以是必要再界说一个排序的算法类完成IComparer接口,来从头界说排序的算法.也就是完成了静态的修正算法(战略形式)
publicstaticvoidMain()
{
Eployeeep1=newEployee();
ep1.name="Charles";
ep1.age=21;
ep1.sex="男";
Eployeeep2=newEployee();
ep2.name="Sun";
ep2.age=43;
ep2.sex="男";
Eployeeep3=newEployee();
ep3.name="Sunny";
ep3.age=18;
ep3.sex="男";
ArrayListEmployeeList=newArrayList();
EmployeeList.Add(ep1);
EmployeeList.Add(ep2);
EmployeeList.Add(ep3);
EmployeeList.Sort(newmyEmployeeCompare());
}
完成IComparer接口的类MyEmployeeCompare以下:
publicclassmyEmployeeCompare:IComparer
{
publicintCompare(objectx,objecty)
{
return(xasEployee).age-(yasEployee).age;
}
}
如许就完成了按岁数巨细从小到猛进行排序。
最初申明一点:
针对Hashtable排序的特别请求,能够先把它的键或值转化成ArrayList,针对ArrayList举行排序,进而也就完成了Hashtable的排序(下面的第二,第三就表现了这一点).究竟ArrayList已撑持一些排序,并且还撑持自界说范例的排序(Strategy),固然还能够本人写算法来完成排序.C#中有两处地方用到new关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。 |