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(List<Person> list,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(List<Person> list, 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<Person>
 {
  @Override
  public int compare(Person o1, Person o2)
  {
   /*
    * 我当时纳闷,我没有调用compare()方法,我们知道Collections.reverseOrder()括号里是一个指定的比较器,
    * 可是我怎么确定我的compare()方法起作用,被调用呢???于是有了如下打印语句。证明确实调用了自己重写的方法。
    * 那谁调用呢???? 一定是reverseOrder()这个方法。于是跟踪源码。如下: public static <T>
    * Comparator<T> reverseOrder(Comparator<T> cmp) { if (cmp == null)
    * return reverseOrder(); return new ReverseComparator2<T>(cmp); }
    * 继续跟踪 ---> ReverseComparator2....源码如下:
    *
    * private static class ReverseComparator2<T> implements
    * Comparator<T>,Serializable { private static final long
    * serialVersionUID = 4374092139857L; private Comparator<T> cmp;
    *
    * ReverseComparator2(Comparator<T> cmp) { 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(List<Person> list, 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<Person>
 {
  @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(List<Person> list, 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<Person>
 {
  @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(List<Person> list, 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)
 {
  ArrayList<Person> list = new ArrayList<Person>();
  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


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值