要求:假如有若干个类Person对象存在一个List当中,对他们进行排序,分别按照名字、年龄、id进行排序(要有正序与倒序两种排序方式)。假如年龄或者姓名重复,按照id的正序进行排序。要求使用策略模式进行。

解决方案 »

  1.   

    这不是很简单吗?每种排序就是一种策略
    调用Collections.sort方法,比较器材用不同的策略返回即可
      

  2.   

    一个可能的设计,仅供参考:PersonManager类
    属性:
    List personList;
    Sorter sorter;
    方法:
    setSorter(Sorter s){
      sorter = s;
    }
    getSortedList(){
      return sorter.sort( personList);
    }Sorter接口
    方法:
    List sort(List input);SortViaNameAsc类,实现Sorter接口
    方法
    List sort(List input){
      //用Name来升序排序
      //如果Name一样,用ID正序排序
    }
      

  3.   

    一个接口 声明sort 作为抽象角色
    一堆类实现接口来分别实现你需要的排序
    策略类维护一个接口对象,用该接口对象调用sort
    如果你上面能看懂还写不出代码那只能说明代码功底不够,还需要多练
      

  4.   

    框架给你写好了 给你实现了一个按年龄的策略  其他的策略你自己加吧  这个你要是都不会那我也没什么说的了,
    package Strategy;public class Person {
    int id;
        String name;
    int age;
         public Person(int id,String name ,int age){
     this.id=id;
     this.age=age;
     this.name=name;
      }}
    package Strategy;import java.util.ArrayList;public class SortPersonList {
    private ArrayList<Person> list=new ArrayList<Person>();
    private AbstractStrategy as;
    public SortPersonList(AbstractStrategy as){
    this.as=as;

    }
    public void setList(ArrayList<Person> list){
    this.list=list;
    as.setList(list);
    }
    public void getInorde(){
    list=as.getInorder();
    }
    public void getReverse(){
    list=as.getReverse();
    }
    public void display(){
    for(Person p:list){
    System.out.println(p.name+" "+p.id+" "+p.age );
    }
    }}package Strategy;import java.util.ArrayList;public abstract class AbstractStrategy {
          protected  ArrayList <Person>  list=new ArrayList<Person>();
          
          public AbstractStrategy(){};
          public void setList(ArrayList<Person> list){ this.list=list;}
          
          
            public AbstractStrategy(ArrayList<Person> list){
             this.list=list;
            }
            abstract  ArrayList<Person> getInorder();
            abstract  ArrayList<Person> getReverse();}package Strategy;import java.util.ArrayList;
    import java.util.*;public class AgeStrategy extends AbstractStrategy {
    public AgeStrategy(){};
    public AgeStrategy(ArrayList<Person> list) {
    super(list);
    } @Override
    ArrayList<Person> getInorder() {
    Collections.sort(list,new AgeComparator());
    return list;
    } @Override
    ArrayList<Person> getReverse() {
    Collections.sort(list,new AgeComparator());
    Collections.reverse(list);
         return list;
    }}
    package Strategy;import java.util.Comparator;public class AgeComparator implements Comparator<Person>{
    public int compare(Person p1, Person p2) {
    if(p1.age>p2.age)
    return 1;
    else if(p1.age<p2.age)
        return 0;
    else if(p1.id>p2.id)
    return 1;
    else return 0;

    }}
    package Strategy;import java.util.ArrayList;public class Client {
    static void process(){
    AbstractStrategy as=new AgeStrategy();
    SortPersonList spl=new SortPersonList(as);
    Person p1=new Person(1,"小明",10);
    Person p2=new Person(2,"小刚",10);
    Person p3=new Person(3,"小亮",8);
    ArrayList<Person> list=new ArrayList<Person>();
    list.add(p1);
    list.add(p2);
    list.add(p3);
    spl.setList(list);
    System.out.println("原始链表");
    spl.display();
    spl.getInorde();
    System.out.println("排序后");
    spl.display();
    System.out.println("逆序后");
    spl.getReverse();
    spl.display();
    }
    public static void main(String [] args){
    Client.process();
    }
    }
    运行结果原始链表
    小明 1 10
    小刚 2 10
    小亮 3 8
    排序后
    小亮 3 8
    小明 1 10
    小刚 2 10
    逆序后
    小刚 2 10
    小明 1 10
    小亮 3 8