美文网首页Java 杂谈
Java 之 Comparable vs Comparator

Java 之 Comparable vs Comparator

作者: Real_man | 来源:发表于2018-10-26 18:01 被阅读6次

    Comparable和Compator都是用于给集合排序的接口,但是他们之间的区别是什么呢。

    • Comparable: 这个接口只有一个方法compareTo。比如我们想通过年龄给用户排序,那么我们的用户要实现Comparable接口的方法,假如一旦要通过用户的评分进行排序,我们就必须要修改compareTo方法。
    // o 是要比较的对象
    // 返回负数,小于要比较的对象
    // 返回 0 ,等于要比较的对象
    // 返回正数,大于要比较的对象
    public interface Comparable<T> {
        public int compareTo(T o);
    }    
    
    • Comparator: 这个接口有两个方法,equals和compare. 要进行比较的类不一定非要实现Comparator接口,由第三方的类实现这个接口来进行排序。 这样的话,排序的种类就可以有很多种,并且像对用户进行排序,我们可以通过年龄,姓名,评分等进行排序也不用修改用户类。我们要做的应该就是写 AgeComparator,NameComparator,RankComparator.
    public interface Comparator<T> {
    // 返回负数,第一个小于第二个的对象,o1 < o2
    // 返回 0 ,对象相等  o1 = o2
    // 返回正数,第一个大于第二个对象 o1 > o2
        int compare(T o1, T o2);
    
      
        // 判断Compator之间是不是相同的
        boolean equals(Object obj);
    }
    
    

    案例

    通过Comaparable排序
    1. 如果是通过评分(rank)进行排序,User类写法如下
    public class User implements Comparable<User>{
        private Integer id;
        private Integer rank;
        private Integer age;
        private String name;
    
        //getter and setter
        
        public User(Integer rank, Integer age, String name) {
            this.rank = rank;
            this.age = age;
            this.name = name;
        }
        
        // 通过rank进行排序
        @Override
        public int compareTo(User o) {
            return this.getRank() - o.getRank();
        }
        
         @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", rank=" + rank +
                    ", age=" + age +
                    '}';
        }
    }
    
    
    1. 如果想要通过年龄进行排序,那么就要修改User对象。
    public class User implements Comparable<User>{
        private Integer id;
        private Integer rank;
        private Integer age;
        private String name;
    
        //getter and setter
        
        public User(Integer rank, Integer age, String name) {
            this.rank = rank;
            this.age = age;
            this.name = name;
        }
        
        // 通过rank进行排序
        @Override
        public int compareTo(User o) {
            return this.getAge() - o.getAge();
        }
        
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", rank=" + rank +
                    ", age=" + age +
                    '}';
        }
    }
    
    1. 写测试类。
    public class App {
        public static void main(String[] args) {
            List<User> list = new ArrayList<User>();
            list.add(new User("aihe",100,23));
            list.add(new User("weidong",80,25));
            list.add(new User("zhangbo",85,28));
            list.add(new User("leizhen",90,29));
            Collections.sort(list);
            System.out.println(list);
        }
    }
    
    通过Comparator进行排序
    1. 如果是通过Rank进行排序,创建RankComparator类。
    public class RankComparator implements Comparator<User> {
        // 通过rank进行排序
        public int compare(User o1, User o2) {
            return o1.getRank() - o2.getRank();
        }
    }
    
    1. 如果是通过年龄进行排序,创建AgeComparator类。
    public class AgeComparator implements Comparator<User> {
        // 通过age进行排序
        public int compare(User o1, User o2) {
            return o1.getAge() - o2.getAge();
        }
    }
    
    1. 测试类。
    public class App {
        public static void main(String[] args) {
            List<User> list = new ArrayList<User>();
            list.add(new User("aihe",100,23));
            list.add(new User("weidong",80,25));
            list.add(new User("zhangbo",85,28));
            list.add(new User("leizhen",90,29));
            Collections.sort(list,new RankComparator());
            //Collections.sort(list,new AgeComparator());
            System.out.println(list);
        }
    }
    

    小结

    如果我们的排序方式一般不会变化,我们知道要排序什么字段,在创建对象的时候可以直接实现Comparable接口。

    如果我们还不清楚要比较什么字段,那么可以等到后续确定的时候实现Comparator接口,Comparator接口是从外部进行排序,不会对对象产生影响。

    参考

    相关文章

      网友评论

        本文标题:Java 之 Comparable vs Comparator

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