java 正序a~z_java 策略模式,list集合,实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复,按id正序排序)...
策略模式:1.抽象策略类,通常由一个接口或者抽象类实现。 2.具体实现类 3.环境角色类,持有一个策略类的引用,最终给客户端调用。
好了,上代码:
package execrise;
import java.util.List;
/**
* 接口
* @author Administrator
* 2013年5月2日 18:57:16
*/
public interface Strange
{
public void sort(Listlist,int i);
}
package execrise;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 具体实现类
* @author Administrator
* 2013年5月2日 18:56:23
*/
public class FindByID implements Strange
{
public int k;
@Override
public void sort(Listlist, int i)
{
System.out.println("i==" + i);
if (i == 1)// j=1 倒序
{
this.k = i;
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else if (i == 0)// i=0 正序
{
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else
{
System.out.println("请输入0或者1(0代表正序,1代表倒序) ");
}
}
private class MyComparator implements Comparator{
@Override
public int compare(Person o1, Person o2)
{
/*
* 我当时纳闷,我没有调用compare()方法,我们知道Collections.reverseOrder()括号里是一个指定的比较器,
* 可是我怎么确定我的compare()方法起作用,被调用呢???于是有了如下打印语句。证明确实调用了自己重写的方法。
* 那谁调用呢???? 一定是reverseOrder()这个方法。于是跟踪源码。如下: public static * ComparatorreverseOrder(Comparatorcmp) { if (cmp == null)
* return reverseOrder(); return new ReverseComparator2(cmp); } * 继续跟踪 ---> ReverseComparator2....源码如下:
*
* private static class ReverseComparator2implements
* Comparator,Serializable { private static final long
* serialVersionUID = 4374092139857L; private Comparatorcmp;
*
* ReverseComparator2(Comparatorcmp) { assert cmp != null;
* this.cmp = cmp; }
*
* public int compare(T t1, T t2) { return cmp.compare(t2, t1); } } *
* 知道ReverseComparator2是个内部类,注意这句话 return cmp.compare(t2,
* t1);这句就是调用我们自己的compare()方法。呵呵,低调低调。。。 */
System.out.print("1" + " ");
if (k == 0)
{
System.out.print("2" + " ");
return o2.getId() - o1.getId();/* 因为正序,所以根据第一个参数大于第二个参数返回正整数。 */
}
else
{
System.out.print("3" + " ");
return o1.getId() - o2.getId();/*比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。*/
}
}
}
}
package execrise;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
*
* @author Administrator 2013年5月2日 18:57:55
*/
public class FindByName implements Strange
{
int k;
@Override
public void sort(Listlist, int i)
{
if (i == 1)// j=1 倒序
{
this.k = i;
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else if (i == 0)// i=0 正序
{
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else
{
System.out.println("请输入0或者1(0代表正序,1代表倒序) ");
}
}
private class MyComparator implements Comparator{
@Override
public int compare(Person o1, Person o2)
{
if (k == 0)
{
return o2.getName().compareTo(o1.getName());
}
else
{
return o1.getName().compareTo(o2.getName());
}
}
}
}
package execrise;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @author Administrator
* 2013年5月2日 18:58:27
*/
public class FindByAge implements Strange
{
int k;
@Override
public void sort(Listlist, int i)
{
if (i == 1)// j=1 倒序
{
this.k = i;
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else if (i == 0)// i=0 正序
{
Collections
.sort(list, Collections.reverseOrder(new MyComparator()));
}
else
{
System.out.println("请输入0或者1(0代表正序,1代表倒序) ");
}
}
private class MyComparator implements Comparator{
@Override
public int compare(Person o1, Person o2)
{
if (k == 0)
{
return o2.getAge() - o1.getAge();
}
else
{
return o1.getAge() - o2.getAge();
}
}
}
}
package execrise;
import java.util.List;
/**
* 2013年5月2日 18:59:12
*
* @author Administrator
*
*/
public class Envrioment
{
Envrioment()
{
}
Envrioment(Strange strange)
{
this.strange = strange;
}
private Strange strange;
public Strange getStrange()
{
return strange;
}
public void setStrange(Strange strange)
{
this.strange = strange;
}
public void invoke(Listlist, int i)
{
strange.sort(list, i);
}
}
package execrise;
import java.util.ArrayList;
/**
* 2013年5月2日 19:01:02
* @author Administrator
* 客户端
*/
public class Client
{
public static void main(String[] args)
{
ArrayListlist = new ArrayList();
Person p1 = new Person(1, "a", 34);
Person p2 = new Person(2, "b", 24);
Person p3 = new Person(3, "c", 24);
Person p4 = new Person(4, "bb", 24);
Person p5 = new Person(5, "ba", 24);
Person p6 = new Person(6, "d", 24);
Person p7 = new Person(7, "d", 24);
Person p8 = new Person(8, "d", 25);
Person p9 = new Person(9, "d", 25);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
list.add(p8);
list.add(p9);
Envrioment e = new Envrioment();
e.setStrange(new FindByID());
int i = 0;// i=0 正序
int j = 1;// j=1 倒序
System.out.println("按照person id 正序排序");
e.invoke(list, i);
for(Person al:list)
{
System.out.println("id="+al.getId()+" name="+al.getName()+" age="+al.getAge());
}
System.out.println("按照person id 降序排序");
e.invoke(list, j);
for(Person a2:list)
{
System.out.println("id="+a2.getId()+" name="+a2.getName()+" age="+a2.getAge());
}
System.out.println("按照person name 正序排序,如果name相同,按照id正序排序");
Envrioment e1 = new Envrioment(new FindByName());
e1.invoke(list, i);
for(Person al:list)
{
System.out.println("id="+al.getId()+" name="+al.getName()+" age="+al.getAge());
}
System.out.println("按照person name 降序排序,如果name相同,按照id正序排序");
e1.invoke(list, j);
for(Person a2:list)
{
System.out.println("id="+a2.getId()+" name="+a2.getName()+" age="+a2.getAge());
}
System.out.println("按照person age 正序排序,如果age相同,按照id正序排序");
Envrioment e2 = new Envrioment(new FindByAge());
e2.invoke(list, i);
for (Person al : list)
{
System.out.println("id=" + al.getId() + " name=" + al.getName()
+ " age=" + al.getAge());
}
System.out.println("按照person age 降序排序,如果age相同,按照id正序排序");
e2.invoke(list, j);
for (Person a1 : list)
{
System.out.println("id=" + a1.getId() + " name=" + a1.getName()
+ " age=" + a1.getAge());
}
}
}
输出结果:
按照person id 正序排序
i==0
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
id=1 name=a age=34
id=2 name=b age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=6 name=d age=24
id=7 name=d age=24
id=8 name=d age=25
id=9 name=d age=25
按照person id 降序排序
i==1
1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
id=5 name=ba age=24
id=4 name=bb age=24
id=3 name=c age=24
id=2 name=b age=24
id=1 name=a age=34
按照person name 正序排序,如果name相同,按照id正序排序
id=1 name=a age=34
id=2 name=b age=24
id=5 name=ba age=24
id=4 name=bb age=24
id=3 name=c age=24
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
按照person name 降序排序,如果name相同,按照id正序排序
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=2 name=b age=24
id=1 name=a age=34
按照person age 正序排序,如果age相同,按照id正序排序
id=7 name=d age=24
id=6 name=d age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=2 name=b age=24
id=9 name=d age=25
id=8 name=d age=25
id=1 name=a age=34
按照person age 降序排序,如果age相同,按照id正序排序
id=1 name=a age=34
id=9 name=d age=25
id=8 name=d age=25
id=7 name=d age=24
id=6 name=d age=24
id=3 name=c age=24
id=4 name=bb age=24
id=5 name=ba age=24
id=2 name=b age=24
java 正序a~z_java 策略模式,list集合,实现id 姓名年龄正序倒序排序(如果年龄或者姓名重复,按id正序排序)...相关推荐
- 两种语言实现设计模式(C++和Java)(三:策略模式)
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...
- Java中避免if-else-if:策略模式
本文仅仅为入门,高手勿喷. 实际工作中,我们总会遇到类似如下的需求: 某支付系统接入以下几种商户进行充值:易宝网易,快线网银,19pay手机支付,支付宝支付,骏网一卡通,由于每家充值系统的结算比例不一 ...
- java输出不同颜色_Java设计模式-策略模式、状态模式
推荐阅读: 一只Tom猫:都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场"! java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计 ...
- java 23 种设计模式-23-java 策略模式(Strategy Pattern)
目录 目录 策略模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运 ...
- Java实际项目运用之策略模式
1. 策略模式概要 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就 ...
- Java设计模式(七)策略模式 模板模式
(十三)策略模式 策略图案限定了多个封装算法,该算法可以相互替换包.法的客户.借用还有一位大神的样例. interface ICalculator{public int calculate(Strin ...
- Java描述设计模式(22):策略模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策 ...
- java设计模式实战-(反射+策略模式)
学完23种设计模式,相信很多同学都疑问,除了单例模式.工厂模式其他模式还有运用的场景吗? 现在这里就举一个例子. 首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景. ...
- Java设计模式之3种策略模式实现
一.什么是策略模式 所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者.比如我们要去某个地方,会根据距离的不同来选择不同的出 ...
最新文章
- PyTorch 笔记(06)— Tensor 索引操作(index_select、masked_select、non_zero、gather)
- Erlang的边界检查(3)
- 1094 The Largest Generation (25 分)【难度: 一般 / 树的遍历】
- 创建线程的办法 java 1615387415
- python实用技巧(一)
- apache php mysql_PHP环境搭建(php+Apache+mysql)
- Linux系统学习之文件管理
- MethodFilterInterceptor(方法拦截器)配置excludeMethors
- SQL server连接数据库
- VMware虚拟机中Linux系统如何修改IP地址
- sourceoffsite,sos_collab,版本控制,安装过程中不能创建数据,相关服务无法启动
- spring框架特点
- BZOJ 2434 阿狸的打字机(fail树)
- Java GridFS MongoDB 下载文件 内容不完整
- Java实现求质数(素数)
- Qt入门-文本框类QLineEdit和QTextEdit
- jstree获得节点的值
- shell删除指定时间之前的文件
- M87 黑洞照片的捕捉背后,这个程序媛功不可没
- python批量写入数据
热门文章
- 响应状态码1xx , 2xx,3xx , 4xx , 5xx
- mac安装软件提示没有权限
- 神经网络和深度学习的简史
- 国家及地区MySQL数据
- php商品浏览页面,jquery仿京东商品放大浏览页面_实例分享
- nginx上传文件大小报错500
- 视频教程-shader 基础之 2D技巧集合-Unity3D
- JavaScript学习--我的第一次作业
- 学计算机未来的规划,未来学习计划范本
- wps 甘特图_「WPS办公助手」3分钟画出高逼格流程图,工作学习规划一目了然,老板都要为你点赞...