仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 722|回复: 8
打印 上一主题 下一主题

[学习教程] 来一篇关于NET的让Hashtable撑持自界说排序

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:28:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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)
&nbsp{
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关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。
莫相离 该用户已被删除
沙发
发表于 2015-1-18 14:44:50 | 只看该作者
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
老尸 该用户已被删除
板凳
发表于 2015-1-25 20:54:04 | 只看该作者
PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
admin 该用户已被删除
地板
发表于 2015-2-4 04:50:27 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
若相依 该用户已被删除
5#
发表于 2015-2-9 16:11:01 | 只看该作者
比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
活着的死人 该用户已被删除
6#
发表于 2015-2-27 10:18:03 | 只看该作者
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-9 01:49:45 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
乐观 该用户已被删除
8#
发表于 2015-3-16 21:07:33 | 只看该作者
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
山那边是海 该用户已被删除
9#
发表于 2015-3-23 04:13:52 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-21 13:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表