提示:
本例子目的是对参加短跑比赛的所有动物进行排名
第一步:所有的动物都应该有一个提供速度的方法
因此直接定义在接口Animal中定义,之后让每一个
参加比赛的动物都实现这一接口即可
Animal接口:
public interface Animal {
public int speed();
}
参加比赛的所有动物:
猪:
public class Pig implements Animal {
@Override
public int speed() {
return 20;
}
}
狗:
public class Dog implements Animal {
@Override
public int speed() {
// TODO Auto-generated method stub
return 50;
}
}
鹰 :
public class Eagle implements Animal {
@Override
public int speed() {
return 100;
}
}
比赛的规则是比较速度,速度快的在前面,所以
需要定义一个比较器:
排名比较器:
public class Rank<T extends Animal> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
//这里乘以-1是为了倒叙排序
return (o1.speed()-o2.speed())*-1;
}
}
重点在于所有参与排名的动物都是要参加比赛的动物,所有参加比赛的
动物都是要实现Animal接口的,为了让不同的动物之间可以进行比较,
我们就需要规定可以在比较器里面进行比较的对象必须要实现Animal的
接口,因为比较器正是调用的比较对象的共同方法/属性进行比较的。
比赛类:
public class Game {
public static void main(String[] args) {
//在它们加入到TreeSet的时候提供了比较的接口
//这样在它们被加进去的时候就已经排好序了
TreeSet<Animal> ts=new TreeSet<Animal>(new Rank<Animal>());
ts.add(new Dog());
ts.add(new Pig());
ts.add(new Eagle());
Iterator<Animal> it=ts.iterator();
while(it.hasNext()) {
Animal a=it.next();
System.out.println("动物的类型: "+a.getClass().getName()+"\t奔跑速度: "+a.speed());
}
}
}
比赛结果:
public class Game {
public static void main(String[] args) {
//在它们加入到TreeSet的时候提供了比较的接口
//这样在它们被加进去的时候就已经排好序了
TreeSet<Animal> ts=new TreeSet<Animal>(new Rank<Animal>());
ts.add(new Dog());
//ts.add(new Person());
ts.add(new Pig());
ts.add(new Eagle());
Iterator<Animal> it=ts.iterator();
int rank=1;
while(it.hasNext()) {
Animal a=it.next();
System.out.println("动物的类型: "+a.getClass().getName()+"\t奔跑速度: "+a.speed()+"\t排名第: "+rank);
rank++;
}
}
}
比赛结果:
动物的类型: chapter15.sub5.Pig 奔跑速度: 20 排名第: 1
动物的类型: chapter15.sub5.Dog 奔跑速度: 50 排名第: 2
动物的类型: chapter15.sub5.Eagle 奔跑速度: 100排名第: 3