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
这是策略模式的典型应用
策略模式是对象的行为模式,其用意是针对一组算法,将每一个算法封闭到具有共同接口的独立的类中,从而使得他们可以相互替换。
下图是排序的策略模式结构(引用):
策略模式涉及到三个角色:
环境角色:持有抽象策略类的引用,并不关心具体的策略实现
抽象策略角色:这是一个抽象的角色,通常由抽象类或接口实现,给出所有具体策略所需的接口方法
具体策略角色:继承抽象策略,实现具体的算法
上例中,环境角色是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;
}
}
}
分享到:
相关推荐
在《设计模式:可复用面向对象软件的基础》一书中,策略模式被定义为:“定义一系列的算法,并把每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用它的客户。”这表明,策略模式的主要目的是...
Java API中的Collections有一个sort方法, sort(List<T> list, Comparator<? super T> c) 其中Comparator是比较算子。通过实现Comparator接口可以定义满足个各种需要的排序方式。...是策略模式运用的一个很好实例!
这些文件可以帮助我们更好地理解如何在实际项目中应用策略模式,以及如何与其他设计模式结合使用。 总结来说,策略模式是一种强大的设计模式,它提供了动态改变对象行为的能力,有助于代码的可扩展性和可维护性。...
在Java中,策略模式的实现通常涉及接口和实现该接口的类,以及一个使用这些策略的上下文。 策略模式的核心在于它的三个角色: 1. **环境角色(Context)**:这是使用策略的角色,它维护了一个对策略对象的引用。在...
简单工厂模式、策略模式以及反射是Java编程中非常重要的概念,它们都是软件设计模式和语言特性的典型应用,对于理解和构建高效、可扩展的代码至关重要。 简单工厂模式是一种创建型设计模式,它提供一个工厂方法,...
这种设计模式被称为策略模式,它可以灵活地改变对象的排序策略。 当你需要的比较规则超出了对象自身提供的比较能力,或者不想修改原始类的源代码时,Comparator接口就派上用场了。Comparator接口有一个`compare()`...
模板模式在于它提供了排序算法的通用框架,而策略模式在于Comparator的使用,允许用户在运行时选择不同的比较策略。这两种模式的结合,使得Java的排序功能既强大又灵活,能够适应各种不同的应用场景。 在实际编程中...
5. **策略模式**:定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户。在Java集合框架中,`Comparator`接口就是策略模式的应用。 6. **适配器模式**:将一个类的接口转换...
`java.util.Comparator`接口就是策略模式的一个实例。 13. 迭代器模式:提供一种方法顺序访问一个聚合对象的元素,而又不暴露其底层表示。Java的`java.util.Iterator`接口和`java.util.ArrayList`等集合类的迭代器...
8. 策略模式:Java Collections框架中的Comparator接口,允许用户定义自己的比较策略。 设计模式的应用不仅限于上述示例,它们在实际开发中无处不在。理解并熟练运用设计模式,可以提升代码质量,使代码更易于理解...
`Comparator`接口在Java中体现了策略模式,可以根据需求选择不同的比较策略。 10. **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Java的`AbstractClass`类常常包含模板方法,子类可以...
策略模式定义了一族算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。在Java集合框架中,Comparator接口就体现了策略模式,可以根据需求定制排序规则。 模板方法模式定义了一...
Java中的Comparator接口和Collections.sort()方法就是策略模式的实例。 15. **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定...
策略模式让算法的变化独立于使用它的客户。Java中的Comparator接口允许根据不同的策略比较对象。 18. **状态模式**:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。在Java中,线程的...
Java集合框架中的排序策略(`Collections.sort(List, Comparator)`)就是策略模式的实例。 9. **模板方法模式**:模板方法模式定义了操作中的算法骨架,允许子类在不改变结构的情况下重写算法的某些步骤。例如,`...
以上就是关于工厂模式、单例模式、策略模式、模板模式、观察者模式、适配器模式、代理模式和命令模式的详细解释,这些模式都是软件设计中常见的解决方案,理解和熟练运用它们对于提升软件质量和可维护性至关重要。...
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法的变化独立于使用算法的客户。Java的Collections.sort()方法就利用了策略模式,根据传入的Comparator实现不同排序策略。 九、职责链...
9. **策略模式**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。Java中的Comparator接口允许在运行时改变排序策略。 10. **状态模式**:允许对象在其内部...
8. **策略模式**:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。Java中的Comparator接口就是一个策略模式的例子。 9. **状态模式**:允许对象在其内部状态...
Java的Collections框架中的排序策略(Comparator)就是策略模式的应用。 9. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。Java的动态代理机制可以实现接口代理,用于日志记录、权限控制等场景。 ...