通用排序函数的功能实现(利用接口和委托实现泛型[通用]排序)
2010-09-29 18:25
621 查看
开发过程中可能会遇到这样的情况:需要定义一个公用的排序函数,该函数能够对所有类型的对象数组进行排序,要实现该功能最关键的一点是知道对象之间比较大小的规则, 排序函数怎样才能知道该规则呢?有两种途径,一种途径是通过接口,另一种途径是通过委托。
通过接口来实现有两种思路。
一种思路是:接口中定义一个比较方法,所有待排序的类都必须实现该方法,排序函数通过调用该方法,实现排序功能,比如C#中的IComparable(或ICompare<T>)接口,接口中定义了一个“int CompareTo(object obj)”(或“int CompareTo(T obj)”)方法,该方法用来定义排序规则。
另一种思路是:接口中定义一个比较方法,然后另外定义一个类(称为辅助类),由辅助类实现接口中的方法,排序函数通过辅助类的某个实例作为参数得到排序规则,比如C#中的System.Collections.Icompare接口(或System.Collections.Generic.Icomparer<T>接口),接口中定义了int Compare(object/T,object/T)方法,用来定义排序规则。
C#中的System.Array具有排序功能,内有名为Sort的排序函数,如:
public static void Sort(Array array);//要求数组元素实现IComparable接口
public static void Sort<T>(T[] array);//要求数组元素实现ICompare<T>接口
还有如:
public static void Sort(Array array, IComparer comparer);//辅助类实现IComparer接口
public static void Sort<T>(T[] array, IComparer<T> comparer);//辅助类实现Icomparer<T>接口
通过委托来实现也有两种思路。
和使用接口类似,一种思路定义一个委托,然后要求待排序的对象实现该委托实例,另一种思路是定义一个辅助委托,定义一个该委托的实例作为排序函数的一个参数。这里不再赘述,道理很简单,下面同样列举一个C#中的实例:
.NET系统定义了一个名为System.Comparison<T>委托,其定义形式如下:
Public delegage int System.Comparison<T>(T x,T y);
利用该委托实现排序功能的是我们经常用到的List<T>集合类(当然List也可以利用接口实现排序,他有很多重载方法),List中有一个public void Sort(Comparison<T> comparison);排序方法用到了该委托。这是委托的第二种思路的实现,我们可以自己对第一种思路进行实验,很简单。
总结
读者朋友可能会产生疑问,既然微软都定义好了这么多方法了,你还自己定义什么排序函数啊,直接拿过来用不就是了,当然大多数情况下我们完全可以直接利用这些方法,上面的Array可以对静态数组进行排序,List可以对动态链表进行排序,看上去足够用了。但是有一个原因需要我们去考虑,那就是算法,微软在.NET中使用的快速排序算法(这个算法有点儿不稳定,当某些元素具有相同的值时,该算法不能保证这些元素会保持最初的顺序),但是排序算法有很多种,根据实际情况我们可能需要应用自己的算法,这样能够对所开发的项目更有利。希望这篇文章对你有用!
通过接口来实现有两种思路。
一种思路是:接口中定义一个比较方法,所有待排序的类都必须实现该方法,排序函数通过调用该方法,实现排序功能,比如C#中的IComparable(或ICompare<T>)接口,接口中定义了一个“int CompareTo(object obj)”(或“int CompareTo(T obj)”)方法,该方法用来定义排序规则。
另一种思路是:接口中定义一个比较方法,然后另外定义一个类(称为辅助类),由辅助类实现接口中的方法,排序函数通过辅助类的某个实例作为参数得到排序规则,比如C#中的System.Collections.Icompare接口(或System.Collections.Generic.Icomparer<T>接口),接口中定义了int Compare(object/T,object/T)方法,用来定义排序规则。
C#中的System.Array具有排序功能,内有名为Sort的排序函数,如:
public static void Sort(Array array);//要求数组元素实现IComparable接口
public static void Sort<T>(T[] array);//要求数组元素实现ICompare<T>接口
还有如:
public static void Sort(Array array, IComparer comparer);//辅助类实现IComparer接口
public static void Sort<T>(T[] array, IComparer<T> comparer);//辅助类实现Icomparer<T>接口
通过委托来实现也有两种思路。
和使用接口类似,一种思路定义一个委托,然后要求待排序的对象实现该委托实例,另一种思路是定义一个辅助委托,定义一个该委托的实例作为排序函数的一个参数。这里不再赘述,道理很简单,下面同样列举一个C#中的实例:
.NET系统定义了一个名为System.Comparison<T>委托,其定义形式如下:
Public delegage int System.Comparison<T>(T x,T y);
利用该委托实现排序功能的是我们经常用到的List<T>集合类(当然List也可以利用接口实现排序,他有很多重载方法),List中有一个public void Sort(Comparison<T> comparison);排序方法用到了该委托。这是委托的第二种思路的实现,我们可以自己对第一种思路进行实验,很简单。
总结
读者朋友可能会产生疑问,既然微软都定义好了这么多方法了,你还自己定义什么排序函数啊,直接拿过来用不就是了,当然大多数情况下我们完全可以直接利用这些方法,上面的Array可以对静态数组进行排序,List可以对动态链表进行排序,看上去足够用了。但是有一个原因需要我们去考虑,那就是算法,微软在.NET中使用的快速排序算法(这个算法有点儿不稳定,当某些元素具有相同的值时,该算法不能保证这些元素会保持最初的顺序),但是排序算法有很多种,根据实际情况我们可能需要应用自己的算法,这样能够对所开发的项目更有利。希望这篇文章对你有用!
相关文章推荐
- Java利用接口和类来实现类似函数指针的功能
- 利用接口与类实现类似于函数指针的功能
- 利用C++11的function和bind功能,实现QStandardItemModel的通用遍历函数
- 利用Windows的API实现C语言的MD5函数功能
- php接口实现拖拽排序功能
- 实现功能要求统计图书的总价,编写方法查询出在50元以上的所有图书,使用排序接口图书按照价格排序(升序排序)
- 关于sort排序通用的函数接口
- java中利用Comparator接口实现自定义排序技巧。
- C#学习之利用泛型实现列表功能
- 【JavaScript】利用sort()函数与文件碎片实现表格的前端排序,兼容IE6原生态
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- 利用事件委托实现用户控件中的行为触发所在页面的处理函数
- php利用内置的svn函数实现的svn版本号的提交、更新、删除、恢复等功能
- 利用委托和泛型实现树的常用操作
- 构建可反转排序的泛型字典类(5)--实现IEnumerable>接口
- Effective C# 学习笔记(三十一)利用IComparable<T>和IComparer<T>接口来实现排序关系
- 函数声明第四章利用函数实现指定的功能
- ,有一款RESTFUL接口的文档在线自动生成+功能测试功能软件——Swagger UI,具体配置过程可移步《Spring Boot 利用 Swagger 实现restful测试》
- 利用比较器接口实现类排序
- java程序利用接口实现发短信功能