【小程序】用策略模式完成自定義類的排序

題目:假如有若干Person對象存放在一個List當中,對他們進行排序,分別按name,ID,age排序(要有正序和逆序),若名字或年齡一樣按ID正序排列。

Person類

public class Person
{
   private int id;
   private String name;
   private int age;
   public Person(int id,String name,int age)
{
	this.id= id;
	this.name= name;
	this.age= age;
}
public int getId()
{
	return id;
}
public void setId(int id)
{
	this.id = id;
}
public String getName()
{
	return name;
}
public void setName(String name)
{
	this.name = name;
}
public int getAge()
{
	return age;
}
public void setAge(int age)
{
	this.age = age;
}
@Override
public int hashCode()
{
	final int prime = 31;
	int result = 1;
	result = prime * result + age;
	result = prime * result + id;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	return result;
}
@Override
public boolean equals(Object obj)
{
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Person other = (Person) obj;
	if (age != other.age)
		return false;
	if (id != other.id)
		return false;
	if (name == null)
	{
		if (other.name != null)
			return false;
	}
	else if (!name.equals(other.name))
		return false;
	return true;
}
@Override
public String toString()
{
	return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}


   
}


策略的公共接口

import java.util.List;


public interface PersonSort
{
    public void sort(List list);
    public void reverse(List list);
    
}


策略類

1.按ID排序

import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class IdSort implements PersonSort
{

	@Override
	public void sort(List list)
	{
		Collections.sort(list,new IdComparator());
	}
	@Override
	public void reverse(List list)
	{
		Comparator c = Collections.reverseOrder(new IdComparator());
		Collections.sort(list,c);
	}
}
class IdComparator implements Comparator
{
	@Override
	public int compare(Object o1, Object o2)
	{
		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		return p1.getId()-p2.getId();
	}
}


2.按年齡排序

import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class AgeSort implements PersonSort
{

	@Override
	public void sort(List list)
	{
		Collections.sort(list,new AgeComparator());

	}
	

	@Override
	public void reverse(List list)
	{
		Comparator c = Collections.reverseOrder(new AgeComparator());
		Collections.sort(list,c);
	}

}
class AgeComparator implements Comparator
{
	@Override
	public int compare(Object o1, Object o2)
	{
		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		if(p1.getAge()==p2.getAge())
		{
			return p1.getId()-p2.getId();
		}
		return p1.getAge()-p2.getAge();
	}
}






3.按名字排序

import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class NameSort implements PersonSort
{
    
	@Override
    public void sort(List list)
    {
		 Collections.sort(list,new NameComparator());
    }
	public void reverse(List list)
	{
	    Comparator c = Collections.reverseOrder(new NameComparator());
	    Collections.sort(list,c);
	}


}

class NameComparator implements Comparator
{
	@Override
	public int compare(Object o1, Object o2)
	{
		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		if(p1.getName().equals(p2.getName()))
		{
			return p1.getId()-p2.getId();
		}
		return p1.getName().compareTo(p2.getName());
	}
}


封裝策略類的環境類

import java.util.List;


public class Environment
{
   private PersonSort personsort; 
   public Environment(PersonSort personsort)
   {
	   this.personsort = personsort;
   }
   public PersonSort getPersonsort()
   {
	    return personsort;
   }
   public void setPersonsort(PersonSort personsort)
   {
	   this.personsort = personsort;
   }
   public void sort(List list)
   {
	   personsort.sort(list);
   }
   public void reverse(List list)
   {
	   personsort.reverse(list);
   }
}


測試類

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;



public class StrategyTest
{
	public static void main(String[] args)
	{
         Person p1 = new Person(201001,"zhangsan",24);
         Person p2 = new Person(201004,"lisi",19);
         Person p3 = new Person(201003,"zhangsan",25);
         Person p4 = new Person(201002,"zhaoliu",27);
         Person p5 = new Person(201006,"lisi",24);
         Person p6 = new Person(201005,"kuroro",24);
         List list = new ArrayList();
         list.add(p1);
         list.add(p2);
         list.add(p3);
         list.add(p4);
         list.add(p5);
         list.add(p6);
         System.out.println("排序前狀態:");
         System.out.println(list);
         System.out.println("-----------------------");
         Environment en = new Environment(new IdSort());
         en.sort(list);
         System.out.println("按ID正序排列:");
         System.out.println(list);
         en.reverse(list);
         System.out.println("按ID逆序排列:");
         System.out.println(list);
         System.out.println("-----------------------");
         en.setPersonsort(new AgeSort());
         en.sort(list);
         System.out.println("按年齡正序排列:");
         System.out.println(list);
         en.reverse(list);
         System.out.println("按年齡逆序排列:");
         System.out.println(list);
         System.out.println("-----------------------");
         en.setPersonsort(new NameSort());
         en.sort(list);
         System.out.println("按名字正序排列:");
         System.out.println(list);
         en.reverse(list);
         System.out.println("按名字逆序排列:");
         System.out.println(list);    
	}
   
         
     
     
     
     
}


打印結果

排序前狀態:
[Person [id=201001, name=zhangsan, age=24], Person [id=201004, name=lisi, age=19], Person [id=201003, name=zhangsan, age=25], Person [id=201002, name=zhaoliu, age=27], Person [id=201006, name=lisi, age=24], Person [id=201005, name=kuroro, age=24]]
-----------------------
按ID正序排列:
[Person [id=201001, name=zhangsan, age=24], Person [id=201002, name=zhaoliu, age=27], Person [id=201003, name=zhangsan, age=25], Person [id=201004, name=lisi, age=19], Person [id=201005, name=kuroro, age=24], Person [id=201006, name=lisi, age=24]]
按ID逆序排列:
[Person [id=201006, name=lisi, age=24], Person [id=201005, name=kuroro, age=24], Person [id=201004, name=lisi, age=19], Person [id=201003, name=zhangsan, age=25], Person [id=201002, name=zhaoliu, age=27], Person [id=201001, name=zhangsan, age=24]]
-----------------------
按年齡正序排列:
[Person [id=201004, name=lisi, age=19], Person [id=201001, name=zhangsan, age=24], Person [id=201005, name=kuroro, age=24], Person [id=201006, name=lisi, age=24], Person [id=201003, name=zhangsan, age=25], Person [id=201002, name=zhaoliu, age=27]]
按年齡逆序排列:
[Person [id=201002, name=zhaoliu, age=27], Person [id=201003, name=zhangsan, age=25], Person [id=201006, name=lisi, age=24], Person [id=201005, name=kuroro, age=24], Person [id=201001, name=zhangsan, age=24], Person [id=201004, name=lisi, age=19]]
-----------------------
按名字正序排列:
[Person [id=201005, name=kuroro, age=24], Person [id=201004, name=lisi, age=19], Person [id=201006, name=lisi, age=24], Person [id=201001, name=zhangsan, age=24], Person [id=201003, name=zhangsan, age=25], Person [id=201002, name=zhaoliu, age=27]]
按名字逆序排列:
[Person [id=201002, name=zhaoliu, age=27], Person [id=201003, name=zhangsan, age=25], Person [id=201001, name=zhangsan, age=24], Person [id=201006, name=lisi, age=24], Person [id=201004, name=lisi, age=19], Person [id=201005, name=kuroro, age=24]]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章