首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

谋略模式与Comparator的定义和使用

2012-09-01 
策略模式与Comparator的定义和使用Comparator可以让我们对复杂的类型进行自定义排序,如按对象的某个属性降

策略模式与Comparator的定义和使用

Comparator可以让我们对复杂的类型进行自定义排序,如按对象的某个属性降序排序,功能很强大,使用起来也方便

只需要简单的实现Comparator接口

定义:

class ComparatorHDFileUserInfo implements Comparator<ScholatHDFileUseInfo>{

?

??? public int compare(ScholatHDFileUseInfo o1, ScholatHDFileUseInfo o2) {???

?

?????? return o1.getTotalSize().compareTo(o2.getTotalSize())>0?0:1;

??? }

}

这里是降序排序,要变为升序,把0和1的位置互换

使用:

?????? Collections.sort(scholatHDFileUseInfoList,new ComparatorHDFileUserInfo());

?

生成自定义Comparator的实例,在Collections.sort方法第二个参数中使用,前一个参数是待排序的List

?

这是策略模式的典型应用

策略模式是对象的行为模式,其用意是针对一组算法,将每一个算法封闭到具有共同接口的独立的类中,从而使得他们可以相互替换。

下图是排序的策略模式结构(引用):

谋略模式与Comparator的定义和使用

策略模式涉及到三个角色:

环境角色:持有抽象策略类的引用,并不关心具体的策略实现

抽象策略角色:这是一个抽象的角色,通常由抽象类或接口实现,给出所有具体策略所需的接口方法
具体策略角色:继承抽象策略,实现具体的算法

上例中,环境角色是Collections,抽象策略是Comparator,而具体策略是ComparatorHDFileUserInfo,实现按网盘总大小降序排列,如果以后改变需求,想按网盘使用者的工作单位排序,只需要实现另外加一个策略,实现Comparator接口。如:

class ComparatorHDFileUserInfoByWorkUtil implements Comparator<ScholatHDFileUseInfo>{

?

??? public int compare(ScholatHDFileUseInfo o1, ScholatHDFileUseInfo o2) {???

?

?????? return o1.getWorkUnit().compareTo(o2.getWorkUnit())>0?0:1;

??? }

}

?

?

Collections.sort(scholatHDFileUseInfoList,new ComparatorHDFileUserInfoByWorkUtil());

?

?

具体选用何种策略,由客户端决定

?

PS:如果要实现多关键字排序要怎么做呢,其实也很简单~

ScholatHDFileUseInfo学者网盘信息类有多个字段,要求多关键字排序,先按工作单位排,若工作单位相同则按大小排列

可以这样实现:

class ComparatorHDFileUserInfo implements Comparator<ScholatHDFileUseInfo>{

?

??? public int compare(ScholatHDFileUseInfo o1, ScholatHDFileUseInfo o2) {???

?????? if(!o1.getWorkUnit().equals(o2.getWorkUnit()))//先按工作单位排列

?????? {

?????????? return o1.getWorkUnit().compareTo(o2.getWorkUnit())>0?0:1;

?????? }

?????? else????????????????????????????????????????? //若工作单位相同,则按大小排列

?????? {

?????????? return o1.getTotalSize().compareTo(o2.getTotalSize())>0?0:1;

?????? }?????

??? }

}

?

?

?

?

?

?

热点排行