美文网首页
Comparable和Comparator

Comparable和Comparator

作者: 笑才 | 来源:发表于2018-11-17 17:28 被阅读0次

Comparable
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:

1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

2、比较者等于被比较者,那么返回0

3、比较者小于被比较者,那么返回负整数

//实现Serializable,标识该类可被序列化
//实现Comparable接口,让此类可以利用Collections.sort()进行排序
public class User<T extends User> implements Serializable,Comparable<T>{
    private String name;
    private int age;
    private transient String address;//transient修饰,标识该类序列化时此字段不需要进行存储
    public User(String name){
        this.name = name;
    }
    
    public User(String name,int age,String address){
        this(name);
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }

    public int compareTo(T o) {
        int returnInt = 0;
        if(age>o.getAge()){
            returnInt=1;
        }else if(age==o.getAge()){
            returnInt=0;
        }else if(age<o.getAge()){
            returnInt=-1;
        }
        return returnInt;
    }
}

public class TestComparable {
    public static void main(String[] args) {
        User u1 = new User("caililiang1",20,"hubei1");
        User u2 = new User("caililiang2",30,"hubei2");
        User u3 = new User("caililiang3",25,"hubei3");
        User u4 = new User("caililiang4",28,"hubei4");
        User u5 = new User("caililiang5",23,"hubei5");
        List<User> list = new ArrayList<User>();
        list.add(u1);list.add(u2);list.add(u3);list.add(u4);list.add(u5);
        for(int i=0;i<list.size();i++){
            User u =list.get(i);
            System.out.println(u.getName()+"--->"+u.getAge());
        }
        System.out.println("排序后---------------------");
        Collections.sort(list);
        for(int i=0;i<list.size();i++){
            User u =list.get(i);
            System.out.println(u.getName()+"--->"+u.getAge());
        }
    }
}
结果:
caililiang1--->20
caililiang2--->30
caililiang3--->25
caililiang4--->28
caililiang5--->23
排序后---------------------
caililiang1--->20
caililiang5--->23
caililiang3--->25
caililiang4--->28
caililiang2--->30

Comparator

Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:

1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较

2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式

Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:

1、o1大于o2,返回正整数

2、o1等于o2,返回0

3、o1小于o3,返回负整数

创建被比较的对象
public class People implements Serializable{
   private String name;
   private int age;
   private transient String address;//transient修饰,标识该类序列化时此字段不需要进行存储
   public People(String name){
       this.name = name;
   }
   
   public People(String name,int age,String address){
       this(name);
       this.age = age;
       this.address = address;
   }

   public String getName() {
       return name;
   }

   public int getAge() {
       return age;
   }

   public String getAddress() {
       return address;
   }
}

创建一个实现Comparator的类,定义比较规则
public class PeopleComparator<T extends People> implements Comparator<T> {
   public int compare(T o1, T o2) {
       int returnInt = 0;
       if(o1.getAge()>o2.getAge()){
           returnInt = 1;
       }else if(o1.getAge()==o2.getAge()){
           returnInt = 0;
       }else if(o1.getAge()<o2.getAge()){
           returnInt = -1;
       }
       return returnInt;
   }
}

测试比较实例
public class TestComparator {
   public static void main(String[] args) {
       People u1 = new People("caililiang1",20,"hubei1");
       People u2 = new People("caililiang2",30,"hubei2");
       People u3 = new People("caililiang3",25,"hubei3");
       People u4 = new People("caililiang4",28,"hubei4");
       People u5 = new People("caililiang5",23,"hubei5");
       List<People> list = new ArrayList<People>();
       list.add(u1);list.add(u2);list.add(u3);list.add(u4);list.add(u5);
       for(int i=0;i<list.size();i++){
           People u =list.get(i);
           System.out.println(u.getName()+"--->"+u.getAge());
       }
       System.out.println("排序后---------------------");
       Collections.sort(list,new PeopleComparator());
       for(int i=0;i<list.size();i++){
           People u =list.get(i);
           System.out.println(u.getName()+"--->"+u.getAge());
       }
   }
}

结果:
caililiang1--->20
caililiang2--->30
caililiang3--->25
caililiang4--->28
caililiang5--->23
排序后---------------------
caililiang1--->20
caililiang5--->23
caililiang3--->25
caililiang4--->28
caililiang2--->30

相关文章

网友评论

      本文标题:Comparable和Comparator

      本文链接:https://www.haomeiwen.com/subject/dllifqtx.html