小红编写了一个Money类,打包成了jar包供我们使用。当我们需要比较两个Money对象的大小或对集合进行排序时,如果该类实现了Comparable<T>,则会实现compareTo(T o)方法,我们只需调用即可。但如果该类没实现Comparable<T>接口,我们该怎么办呢?让小红修改一下Money类?不太可能,这时需要用到Comparator<T>接口,该接口在不修改类的情况下可以实现对象比较大小或集合排序。
示例如下:
一、实现Comparable<T>接口进行对象大小比较或集合排序
1.Person类实现了Comparable<T>
public class Person implements Comparable<Person>{
private Double value;
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
/**
* 用于集合排序则为升序
* @param o
* @return
*/
@Override
public int compareTo(Person o) {
return this.value.compareTo(o.getValue());
}
}
2.Person对象比较大小或集合进行排序
/**
* Person对象比较大小
*/
@Test
public void personCompareOne(){
Person p = new Person();
p.setValue(Math.random());
Person e = new Person();
e.setValue(Math.random());
int num=p.compareTo(e);
Assert.assertNotNull(num);
}
/**
* Person集合进行升序排序
*/
@Test
public void personCompareList(){
List<Person> people=new ArrayList<Person>();
for(int i=0;i<10;i++){
Person person = new Person();
person.setValue(Math.random());
people.add(person);
}
Collections.sort(people);
Assert.assertNotNull(people);
}
二、没实现Comparable<T>类,使用Comparator<T>进行对象大小比较或集合排序
1.Money类没实现Comparator<T>,但有一个私有类
public class Money {
private Double value;
public static final Comparator<Money> MONEY_COMPARATOR=new MoneyComparator();
private static class MoneyComparator implements Comparator<Money>,java.io.Serializable{
/**
* 升序排序
* @param o1
* @param o2
* @return
*/
@Override
public int compare(Money o1, Money o2) {
return o1.getValue().compareTo(o2.getValue());
}
}
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
}
2.Money对象实现比较大小或集合排序
/**
* Money对象比较大小
*/
@Test
public void moneyCompareOne(){
Money m = new Money();
m.setValue(Math.random());
Money o = new Money();
o.setValue(Math.random());
int num=Money.MONEY_COMPARATOR.compare(m,o);
Assert.assertNotNull(num);
}
/**
* Money集合进行升序排序
*/
@Test
public void testAdd(){
List<Money> monies=new ArrayList<Money>();
for(int i=0;i<10;i++){
Money money =new Money();
money.setValue(Math.random());
monies.add(money);
}
Collections.sort(monies,Money.MONEY_COMPARATOR);
Assert.assertNotNull(monies);
}