实现过程也是用了java的策略模式的概念,刚好回顾以往所学知识。

1:定义比较对象属性
/*
 * 需要进行策略比较的对象
 */
public class Person {
    private String name;
    private int Id;
    private int age;
    
    public Person(String name,int age,int Id){
        this.age = age;
        this.name = name;
        this.Id = Id;
    }

public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }

public int getId() {
        return Id;
    }

public void setId(int id) {
        Id = id;
    }

public int getAge() {
        return age;
    }

public void setAge(int age) {
        this.age = age;
    }
}

2:比较策略的公共接口

/*
 * 策略模式的公共接口
 */
public interface Strategy {
    public void sort(List<Person> list);
}

3:比较策略接口的实现类

/*
 * 按照ID排序的策略类,实现Strategy策略接口
 */
public class StrategyById implements Strategy, Comparator<Person> {
    
    private boolean AscFlag;//true--表示升序;false---表示降序
    
    public StrategyById(boolean AscFlag){
        this.AscFlag = AscFlag;
    }

@Override
    public void sort(List<Person> list) {

//StrategyById(AscFlag) 既是策略类有事比较器的实现  Collections.sort(List<Person> list, Comparator<? super Person>c)
          Collections.sort(list, new StrategyById(AscFlag));
    }

@Override
    public int compare(Person o1, Person o2) {//按照Id排序
    
        int result = o1.getId() -o2.getId();
                
      return AscFlag?result:-result;
    }

}

/*
 * 按照Age排序的策略类,实现Strategy策略接口
 */
public class StrategyByAge implements Comparator<Person>, Strategy {
    
    private boolean AscFlag;//true--表示升序;false---表示降序O
    public StrategyByAge(boolean AscFlag){
        this.AscFlag = AscFlag;
    }

@Override
    public void sort(List<Person> list) {
        
        Collections.sort(list, new StrategyByAge(AscFlag));
    }

@Override
    public int compare(Person o1, Person o2) {
        int result = o1.getAge() - o2.getAge();/
        if(result == 0){//0--表示年龄相同
            return o1.getId() - o2.getId();
        }
        return AscFlag?result:-result;
    }

}

/*
 * 按照姓名排序的策略类,实现Strategy策略接口
 */
public class StrategyByName implements Strategy, Comparator<Person>{
    
    private boolean AscFlag;//true--表示升序;false---表示降序
    
    public StrategyByName(boolean AscFlag){
        this.AscFlag = AscFlag;
    }
    
    @Override
    public int compare(Person o1, Person o2) {
        //姓名一样的话按照Id升序
        int result = o1.getName().compareTo(o2.getName());//0-相等;-1--升序;1降序
        if(result == 0){
            return o1.getId() - o2.getId();
        }
        return AscFlag?result:-result;//AscFlag-true 升序排
    }

@Override
    public void sort(List<Person> list) {
        
        Collections.sort(list, new StrategyByName(AscFlag));
    }
}

4、定义策略类的执行环境类

/*
 * 在使用策略对象的类中保存一个对策略对象的引用。实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。
 */
public class Environment {
    
    private Strategy strategy;
    private List<Person> list;
    
    public Environment(Strategy strategy,List<Person> list){
        this.list = list;
        this.strategy = strategy;
    }
    public void sort(){
        this.strategy.sort(list);
    }
}

5、测试

public class Client {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<Person>();
        list.add(new Person("zhangsan",28,11));
        list.add(new Person("zhangsan",28,12));
        list.add(new Person("lisi",27,10));
        list.add(new Person("lisi",28,9));
        list.add(new Person("wangwu",30,8));
        list.add(new Person("zhaoliu",30,7));
        list.add(new Person("housi",22,6));
        list.add(new Person("feiyang",32,4));
        
        Environment environment = null ;
        environment = new Environment(new StrategyById(true), list);//按照ID正序
        environment.sort();
        System.out.println("====按照ID正序排列===");
        for(Person p: list){
                System.out.println(p.getId()+"  "+p.getName()+"  "+p.getAge());    
        }
        environment = new Environment(new StrategyById(false), list);//按照ID倒序
        environment.sort();
        System.out.println("====按照ID倒序排列===");
        for(Person p: list){
                System.out.println(p.getId()+"  "+p.getName()+"  "+p.getAge());    
        }
        environment = new Environment(new StrategyByName(true), list);//按照ID正序
        environment.sort();
        System.out.println("====按照name正序排列===");
        for(Person p: list){
                System.out.println(p.getId()+"  "+p.getName()+"  "+p.getAge());    
        }
        environment = new Environment(new StrategyByName(false), list);//按照ID倒序
        environment.sort();
        System.out.println("====按照Name倒序排列===");
        for(Person p: list){
                System.out.println(p.getId()+"  "+p.getName()+"  "+p.getAge());    
        }
        environment = new Environment(new StrategyByAge(true), list);//按照ID正序
        environment.sort();
        System.out.println("====按照Age正序排列===");
        for(Person p: list){
                System.out.println(p.getId()+"  "+p.getName()+"  "+p.getAge());    
        }
        environment = new Environment(new StrategyByAge(false), list);//按照ID倒序
        environment.sort();
        System.out.println("====按照Age倒序排列===");
        for(Person p: list){
                System.out.println(p.getId()+"  "+p.getName()+"  "+p.getAge());    
        }
        
    }
}

Java中先按照姓名排序(姓名相同)在按照年龄排序(年龄相同)按照编号 排序呢 策略模式相关推荐

  1. java中属于高级事件的有,(盘点)计算机等级考试题库,二级Java试题

    在等剧更新的时间,赶紧进来刷刷题.复习一下,看剧.刷题,两不耽误,非常完美!以下是二级Java试题,赶紧看看吧! 文章推荐: 温馨提示: 考试想拿高分吗?更多计算机等级考试题库二级ms office试 ...

  2. java策略模式 if else_Java如何利用策略模式替代if/else语句

    平时在开发中避免不了使用大量的if else语句,但过多层的if else对于性能有很大的开销,类似如下代码 public class MainStart { public static void m ...

  3. Java设计模式--策略模式

    策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合 策略模式就是用来封装算法的, ...

  4. 集合练习。学生信息包括学号、姓名、出生日期、性别。把N个学生的信息放入一个集合中。可以根据学号,对学生信息进行检索。并可以根据生日进行排序输出。

    集合练习.学生信息包括学号.姓名.出生日期.性别.把N个学生的信息放入一个集合中.可以根据学号,对学生信息进行检索.并可以根据生日进行排序输出. Student.java package Collec ...

  5. java中实现客户姓名添加和显示

    java中使用带参的方法实现对学生姓名的添加和显示: 首先我们创建一个名为Student类的学生类,由于需要添加多个学生信息,那么我们就先在Student类中声明一个存放学生姓名的数组: String ...

  6. java 正序a~z_java 策略模式,list集合,实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复,按id正序排序)...

    策略模式:1.抽象策略类,通常由一个接口或者抽象类实现. 2.具体实现类 3.环境角色类,持有一个策略类的引用,最终给客户端调用. 好了,上代码: package execrise; import j ...

  7. java中的默认排序规则,C#中列表,集合排序Sort,OrderBy与Java排序规则默认不一致...

    最近遇到一个排序小问题,java中的sort与C#中的Sort排出来结果不一样.后面写了两段小代码,结果确实不一样.var list2 = new List() { "AA",&q ...

  8. java中自然排序和比较器排序

    这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...

  9. java中集合的排序

    java中集合的排序 import java.util.Set; import java.util.HashSet; import java.util.List; import java.util.A ...

最新文章

  1. nodejs繁琐地自建路由
  2. linux 调用 fudanNLP
  3. python的内置对象有哪些、列举说明_Python内置对象汇总
  4. [软件工程] 查找二维数组最大子数组的之和 郭莉莉李亚文
  5. python numpy官网_python+numpy+scipy=matlab,抛弃matlab
  6. linux运行python乱码_linux下python中文乱码解决方案详解
  7. 虚拟机类加载机制---类加载器
  8. zabbix' failed: [1044] Access denied for user 'zab
  9. 硬件结构图_那曲地表水电子除垢仪结构图
  10. 10.8.8.8柠檬wifi网页登录_基于企业邮箱进行wifi实名认证的方案
  11. 机器学习方法_机器学习大拿253页新书:可解释机器学习方法的局限籍(附下载)...
  12. 必看!100道Java程序员面试题(含答案)!
  13. 快速故障定位 看联想和Riverbed如何演绎?
  14. 关于沉没成本的座谈会
  15. 太真实,北上广深年薪20W、30W、40W的程序员的生活状态!
  16. 转:查尔斯·汉迪:你是谁,比你做什么更重要
  17. ping问题详解(请求超时,无法访问目标主机)
  18. Linux Crontab执行hadoop命令脚本失败
  19. 苹果app不能上架怎么办?
  20. OpenCV | Mat类的copyT、clone、=赋值的区别

热门文章

  1. 几种冗余机械臂逆向运动学方法(带公式推导)
  2. (转自天涯虚拟社区)
  3. 浙江省计算机考证发证中心
  4. 最新版谷歌浏览器更新后下载时奔溃
  5. (二)开集识别学习 open-set recognition(OSR)
  6. Linux服务器搭建SVN版本管理工具
  7. JAVA之利用集合操作学生数据
  8. IDEA vmoptions配置
  9. matlab金字塔,高斯金字塔的matlab实现
  10. 用“电子政务”建设电子政务