Java中先按照姓名排序(姓名相同)在按照年龄排序(年龄相同)按照编号 排序呢 策略模式
实现过程也是用了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中先按照姓名排序(姓名相同)在按照年龄排序(年龄相同)按照编号 排序呢 策略模式相关推荐
- java中属于高级事件的有,(盘点)计算机等级考试题库,二级Java试题
在等剧更新的时间,赶紧进来刷刷题.复习一下,看剧.刷题,两不耽误,非常完美!以下是二级Java试题,赶紧看看吧! 文章推荐: 温馨提示: 考试想拿高分吗?更多计算机等级考试题库二级ms office试 ...
- java策略模式 if else_Java如何利用策略模式替代if/else语句
平时在开发中避免不了使用大量的if else语句,但过多层的if else对于性能有很大的开销,类似如下代码 public class MainStart { public static void m ...
- Java设计模式--策略模式
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合 策略模式就是用来封装算法的, ...
- 集合练习。学生信息包括学号、姓名、出生日期、性别。把N个学生的信息放入一个集合中。可以根据学号,对学生信息进行检索。并可以根据生日进行排序输出。
集合练习.学生信息包括学号.姓名.出生日期.性别.把N个学生的信息放入一个集合中.可以根据学号,对学生信息进行检索.并可以根据生日进行排序输出. Student.java package Collec ...
- java中实现客户姓名添加和显示
java中使用带参的方法实现对学生姓名的添加和显示: 首先我们创建一个名为Student类的学生类,由于需要添加多个学生信息,那么我们就先在Student类中声明一个存放学生姓名的数组: String ...
- java 正序a~z_java 策略模式,list集合,实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复,按id正序排序)...
策略模式:1.抽象策略类,通常由一个接口或者抽象类实现. 2.具体实现类 3.环境角色类,持有一个策略类的引用,最终给客户端调用. 好了,上代码: package execrise; import j ...
- java中的默认排序规则,C#中列表,集合排序Sort,OrderBy与Java排序规则默认不一致...
最近遇到一个排序小问题,java中的sort与C#中的Sort排出来结果不一样.后面写了两段小代码,结果确实不一样.var list2 = new List() { "AA",&q ...
- java中自然排序和比较器排序
这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...
- java中集合的排序
java中集合的排序 import java.util.Set; import java.util.HashSet; import java.util.List; import java.util.A ...
最新文章
- nodejs繁琐地自建路由
- linux 调用 fudanNLP
- python的内置对象有哪些、列举说明_Python内置对象汇总
- [软件工程] 查找二维数组最大子数组的之和 郭莉莉李亚文
- python numpy官网_python+numpy+scipy=matlab,抛弃matlab
- linux运行python乱码_linux下python中文乱码解决方案详解
- 虚拟机类加载机制---类加载器
- zabbix' failed: [1044] Access denied for user 'zab
- 硬件结构图_那曲地表水电子除垢仪结构图
- 10.8.8.8柠檬wifi网页登录_基于企业邮箱进行wifi实名认证的方案
- 机器学习方法_机器学习大拿253页新书:可解释机器学习方法的局限籍(附下载)...
- 必看!100道Java程序员面试题(含答案)!
- 快速故障定位 看联想和Riverbed如何演绎?
- 关于沉没成本的座谈会
- 太真实,北上广深年薪20W、30W、40W的程序员的生活状态!
- 转:查尔斯·汉迪:你是谁,比你做什么更重要
- ping问题详解(请求超时,无法访问目标主机)
- Linux Crontab执行hadoop命令脚本失败
- 苹果app不能上架怎么办?
- OpenCV | Mat类的copyT、clone、=赋值的区别