Comparable比较器的使用
public class ComparableUser implements Comparable{
private String id;//主键
private int age;//年龄
public ComparableUser(String id,int age) {
this.id = id;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Object o) {
//使用年龄比较
return this.age - ((ComparableUser)o).getAge();
}
public static void main(String[] args) {
ComparableUser user1 = new ComparableUser("1",20);
ComparableUser user2 = new ComparableUser("2",18);
if(user1.compareTo(user2) > 0){
System.out.println("年龄:用户1大于用户2");
}else if(user1.compareTo(user2) < 0){
System.out.println("年龄:用户1小于拥护2");
}else{
System.out.println("年龄:用户1等于用户2");
}
}
}
Comparator比较器的使用
import java.util.Comparator;
public class User {
private String id;//主键
private int age;//年龄
public User(String id,int age) {
this.id = id;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
User user1 = new User("1", 20);
User user2 = new User("1", 18);
Comparator comp = new UserComparator();//生成比较器
int ret = comp.compare(user1,user2);
if(ret > 0){
System.out.println("用户1的年龄大于用户2");
} else if(ret < 0) {
System.out.println("用户1的年龄小于用户2");
} else {
System.out.println("用户1的年龄等于用户2");
}
}
}
//外比较器 一般命名风格为 要比较的对象+Comparator
class UserComparator implements Comparator{
@Override//通过年龄比较
public int compare(Object age1, Object age2) {
User user1 = (User)age1;//类型转换
User user2 = (User)age2;
return user1.getAge() - user2.getAge();//结果
}
}
Comparable和Comparator的区别
如果一个集合元素的类型是可以比较的 那就说明他实现了Comparable接口,有了默认的排序方法,如果不能比较,则没有实现,这时候可以使用比较器来实现动态排序。
Comparator适用于: 一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
区别:
-
Comparable是内比较器 是在类中实现的 要比较的类作为了实现类(需要比较的类作为实现类)。
-
Comparator是外比较器 是在外部写一个专门的实现类来进行比较对象的(单独写一个类实现接口,作为实现类)。
-
Comparable中的compareto方法 中有一个参数,相比 Comparator中的compare方法的两个参数,
前者可以比较不同的对象(this.对象名.compareto(另一个对象)), 后者只能比较两个相同的对象。 -
Comparable的compareto方法耦合性高于Comparator的compare()方法,因为Comparable要修改算法的话是在Compareble接口的实现类(需要比较的类作为实现类)中修改的,而Comparator的修改算法实在外部的实现类中完成的。
-
Comparator接口更加灵活
因为是外比较器,所以可以定义某个类的多个外比较器,在排序的时候根据需要调用多个比较器,而Comparable接口是内比较器,对这个需要比较的类来说,只能实现一个内比较器。