zoukankan      html  css  js  c++  java
  • Comparable接口和Comparator接口

    1、一个类在设计之初就要实现对该类对象的排序功能,那么这个类要实现Comparable接口,实现public int compareTo(T t)方法。如代码中的Student类。
    对于实现Comparable接口的类,

    调用java.util.Arrays.sort(Object[] a)对包含对象实例的数组进行排序,

    调用java.util.Collections.sort(List<T> list)对包含对象实例的list进行排序。


    2、若一个类在设计之初并没有对排序功能的需求,而是在后续的使用中想要对这个类添加排序的功能,如Teacher类。这时的办法是实现一个比较器类,
    如TeacherComparator类,实现public int compare(T t1, T t2)让该类实现Comparator接口。

    调用java.util.Arrays.sort(T[] a, Comparator<? super T> c) 对包含对象实例的数组进行排序,
    调用java.util.Collections.sort(List<T> list, Comparator<? super T> c) 对包含对象实例的list进行排序。

    3、a.compareTo(b)方法和compare(a,b)方法,在方法中判断两个对象的某个或某些属性的大小关系,若a的某个属性比b的属性小,返回负整数,若相等,返回0,否则返回正整数。

    if a.attr < b.attr

    return -1 

    else 

    return 1

    上面即为按照某属性从小到大排序。

    if a.attr < b.attr

    return 1 

    else 

    return -1

    上面为按照某属性从大到小排序。

    以下代码按照Score从高到底排序,若Score相同,则按照age从小到大排序。

    public class Student implements Comparable<Student>{
        
        private String name;
        private int id;
        private int score;
        private int age;
        
        
        public Student(String name, int id, int score, int age) {
            super();
            this.name = name;
            this.id = id;
            this.score = score;
            this.age = age;
        }
        
        @Override
        public int compareTo(Student s) {
            if (this.score < s.getScore()) {
                return 1;
            } else if (this.score > s.getScore()) {
                return -1;
            } else {
                if (this.age < s.getAge()) {
                    return -1;
                } else {
                    return 1;
                }
            }
        }
        
        public String getName() {
            return name;
        }
    
    
    
        public void setName(String name) {
            this.name = name;
        }
    
    
    
        public int getId() {
            return id;
        }
    
    
    
        public void setId(int id) {
            this.id = id;
        }
    
    
    
        public int getScore() {
            return score;
        }
    
    
    
        public void setScore(int score) {
            this.score = score;
        }
    
    
    
        public int getAge() {
            return age;
        }
    
    
    
        public void setAge(int age) {
            this.age = age;
        }
    
    
    
        public static void main(String[] args) {
            
            System.out.println("use Interface Comparable");
            System.out.println();
            
            System.out.println("Array ");
            System.out.println();
            
            Student[] stu = {new Student("a", 1, 88, 18),
                    new Student("b", 2, 78, 16),
                    new Student("c", 3, 88, 17),
                    new Student("d", 4, 78, 16),
                    new Student("e", 5, 100, 18)};
            
            Arrays.sort(stu);
            for (Student s : stu) {
                System.out.println(s.getScore() + "  " + s.getAge());
            } 
            
            System.out.println("***");
            System.out.println("List");
            System.out.println();
            
            List<Student> list = new ArrayList<Student>();
            list.add(new Student("a", 1, 88, 18));
            list.add(new Student("b", 2, 78, 16));
             list.add(new Student("c", 3, 88, 17));
             list.add(new Student("d", 4, 78, 16));
             list.add(new Student("e", 5, 100, 18));
             Collections.sort(list);
             for (Student s : list) {
                 System.out.println(s.getScore() + "  " + s.getAge());
             }
             System.out.println();
             System.out.println("use Interface Comparator");
             System.out.println();
             System.out.println("Array");
             System.out.println();
             
             Teacher[] teach = {
                     new Teacher("a", 1, 88, 18),
                        new Teacher("b", 2, 78, 16),
                        new Teacher("c", 3, 88, 17),
                        new Teacher("d", 4, 78, 16),
                        new Teacher("e", 5, 100, 18)};
            Arrays.sort(teach, new TeacherComparator());     
            for (Teacher t : teach) {
                System.out.println(t.getScore() + "  " + t.getAge());
            } 
            
            System.out.println();
            System.out.println("List");
            System.out.println();
            
            List<Teacher> tList = new ArrayList<Teacher>();
            tList.add(new Teacher("a", 1, 88, 18));
            tList.add(new Teacher("b", 2, 78, 16));
            tList.add(new Teacher("c", 3, 88, 17));
            tList.add(new Teacher("d", 4, 78, 16));
             tList.add(new Teacher("e", 5, 100, 18));
             Collections.sort(tList, new TeacherComparator());
             for (Teacher t : tList) {
                 System.out.println(t.getScore() + "  " + t.getAge());
             }
        }
    }
    
    class Teacher {
        
        private String name;
        private int id;
        private int score;
        private int age;
        
    
        public Teacher(String name, int id, int score, int age) {
            super();
            this.name = name;
            this.id = id;
            this.score = score;
            this.age = age;
        }
    
    
        public String getName() {
            return name;
        }
    
    
        public void setName(String name) {
            this.name = name;
        }
    
    
        public int getId() {
            return id;
        }
    
    
        public void setId(int id) {
            this.id = id;
        }
    
    
        public int getScore() {
            return score;
        }
    
    
        public void setScore(int score) {
            this.score = score;
        }
    
    
        public int getAge() {
            return age;
        }
    
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    class TeacherComparator implements Comparator<Teacher> {
    
        @Override
        public int compare(Teacher t1, Teacher t2) {
            
            if (t1.getScore() < t2.getScore()) {
                return 1;
            } else if (t1.getScore() > t2.getScore()) {
                return -1;
            } else {
                if (t1.getAge() < t2.getAge()) {
                    return -1;
                } else {
                    return 1;
                }
            }
        }
        
    }
  • 相关阅读:
    后缀数组板子
    上海高校金马五校赛 J
    西安电子科技大学第16届程序设计竞赛网络同步赛 G-小国的复仇
    HDU
    string 与char* char[]之间的转换 .
    (分治思想)(归并排序)C
    如何取出 Map中key和value的值
    C++ STL 中 map 容器的说明和使用技巧 .
    (经典map)A
    Babelfish(6.1.2)(sort结构体排序)(sscanf()基本使用方法)(二分法)
  • 原文地址:https://www.cnblogs.com/sodawoods-blogs/p/6413513.html
Copyright © 2011-2022 走看看