題目:假如有若干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]]