数据结构学了那么久,昨天晚上突然看见网上评测自己写的快速排序和.net自带的sort,结果竟然没有.net自带的快。这个结果让我一直喜欢自己写代码的人着实郁闷了把。所以研究了下.net自带的sort。 今天就拿自己写的日程提醒为例来讲讲如何实现自动排序。 首先,要想实现集合自动排序必须实现IComparable接口,接下来我们就按照提醒时间为我们日程排序。
1 public class Appoint:IComparable<Appoint> 2 { 3 private DateTime _remindTime; 4 private object _appointObject; 5 public Appoint(DateTime dt,object appointment) 6 { 7 _remindTime = dt; 8 _appointObject = appointment; 9 } 10 public DateTime RemindTime 11 { 12 get { return _remindTime; } 13 set { _remindTime = value; } 14 } 15 public object AppointObject 16 { 17 get { return _appointObject; } 18 set { _appointObject = value; } 19 } 20 public bool RemoveCompare(Appoint other) 21 { 22 if (_remindTime.CompareTo(other._remindTime) == 0 && _appointObject == other._appointObject) 23 return true; 24 return false; 25 } 26 27 public override string ToString() 28 { 29 return string.Format("Remind time: {0}{1}Appointment:{2}{1}", _remindTime.ToString("yyyy-MM-dd hh:mm:ss"), Environment.NewLine, _appointObject.ToString()); 30 } 31 32 #region IComparable<Appoint> 成员 33 34 public int CompareTo(Appoint other) 35 { 36 return _remindTime.CompareTo(other._remindTime); 37 } 38 39 #endregion 40 }
哈哈,因为是按照时间的,而DateTime类已经为我们实现了IComparable接口,所以只要在自己实现的类中返回时间的比较结果就可以了。 这里给不幸要完全自己写ComapreTo方法的程序员一点提示,是摘自MSDN的
------------------我是无敌分割线----------------- 此方法只是一个定义,必须由特定的类或值类型实现才能生效。“小于”、“等于”和“大于”这几种比较的含义取决于具体的实现。 根据定义,任何对象与 空引用(在 Visual Basic 中为 Nothing) 相比较都要大,两个空引用的比较结果为彼此相等。 给实现者的说明 对于对象 A、B 和 C,以下条件必须为真: 给调用者的说明 使用 CompareTo 方法可确定类的实例的排序。 ------------------我是无敌分割线-----------------
回到正题,将上面的日程类写完后就能对日程类的集合实现自动排序了。何为自动排序,就是.Sort()->排好了,多轻松。我们来看看排序的代码。
1 class AppList 2 { 3 private List<Appoint> _ap; //Appoint类的集合 4 public void AddAppoint(Appoint app) //像集合插入一个日程,并对所有日程重新排序 5 { 6 _ap.Add(app);//插入 7 _ap.Sort(); //排序 8 } 9 }
一句_ap.Sort()搞定一切,多轻松。这里顺便告诉大家一个实现IComparable接口的另一个好处。要知道这里是插入一个日程后就重新排序。虽然快速排序很快,但是其最优实现也是N*lgN的时间消耗。与其每次插入,不如在插入的时候就按照顺序,这样就不用排序了。如果我们定义好了IComaprable接口,那么一切不用操心,SortedList<>泛型为你实现一切,如果读者有兴趣,可以参考CSDN的这篇文章(SortedList-asp.net入门笔记(七)),这里就不在赘述了。 文章比较基础,高手勿怪,如果有错误敬请指正,谢谢。 |
|
来自: 球球圆圆豆豆 > 《对自定义对象集合进行自定义排序的方法》