前几天去oracle面试,考官出了这样一个题:
student类有id,name,score三个属性,现在又许多student实例,问:实现对student的name,score的排序(包括升序和降序两种)。
我是这样写的,我写了4个comparator(分别是按name升序、按name降序,按score升序,按score降序),他们都实现Comparator接口,并且我自己仿照Arrays.sort(Object[] a)写了自己的快排算法,实现了考官的功能,但是考官说加入我让你也对id排序,那么你还新建两个comparator吗?当时我就不会了。
大家能不能利用面向对象的思想设计一下这个排序,达到代码的复用,不论按照哪个属性排序都不会新建类,或者说不论排序需求是不变化是否增加都不用再创建新的comparator,给个设计方案就好
student类有id,name,score三个属性,现在又许多student实例,问:实现对student的name,score的排序(包括升序和降序两种)。
我是这样写的,我写了4个comparator(分别是按name升序、按name降序,按score升序,按score降序),他们都实现Comparator接口,并且我自己仿照Arrays.sort(Object[] a)写了自己的快排算法,实现了考官的功能,但是考官说加入我让你也对id排序,那么你还新建两个comparator吗?当时我就不会了。
大家能不能利用面向对象的思想设计一下这个排序,达到代码的复用,不论按照哪个属性排序都不会新建类,或者说不论排序需求是不变化是否增加都不用再创建新的comparator,给个设计方案就好
private String property;
private int order;
public StudentComparator(String property, int order) {
this.property = property;
this.order = order;
} @Override
public int compare(Student o1, Student o2) {
// TODO: 根据property得到比较的属性,order得到顺序还是逆序。
return 0;
}
}
C.setOrderingProperty(),设置排序用的属性名
C.setOrderingDirection(),设置升序还是降序排序
C.Compare(O1,O2),根据设置的属性名,通过反射取O1,O2的相应属性,并且区分其是数字还是字符串,根据之前设置的升降序进行比较
Student.class.getField(property).get(o1);//获得o1的property属性
Student.class.getField(property).get(o2);//获得o2的property属性
但是我怎么比较这两个属性,我不知道这两个属性到底是String还是int或者是其他的类型,我是用大于号比较还是用Object类的comparaTo方法比较?
另外,升序降序没必要实现吧,Collection的排序方法里就可以指定升序还是降序。
如果还有你自己定义的其它类型,则你在定义的时候应该提供该类型的compare方法
如果从程序的鲁棒性考虑,在Comparator的compare方法中可以针对这样的类型首先寻找该类型的compare方法,如果找不到,则用其它方法如getId()或者toString()来比较
你只要定义一个动态SQL语句就可以很轻松实现对Student的每一个字段进行升序和降序排列了。
http://docs.oracle.com/cd/B19306_01/appdev.102/b14260/adobjint.htm
http://www.stylusstudio.com/sqlxml_tutorial.html
总之采用SQL是对于该种需求解决方案的方向和思路。回到面试上再谈,如果你将来面对的是oracle底层类库的开发那就另当别论,也许利用类反射机制开发一个支持多种数据类型的 comparator是一个好的选择,前面有人已经回答了,我就不赘述了。面对问题一定要搞清需求,发散思路,不能太局限于某个技术。
http://blog.csdn.net/e437032193/article/details/6625849