zoukankan      html  css  js  c++  java
  • Java基础--比较器Comparator

    Comparable接口和Comparator接口都是用来定义集合中的排序的,只是Comparable是在集合内部定义排序的实现,Comparator是在集合外部排序的实现。

    Comparable 的在java.util中
    Comparator 的在java.lang中

    Comparable接口的实现表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
    Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
    1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象或类本身
    2、对象之间可以使用多种排序方法

    最好将equals方法也实现了,并且与compare方法对应。

    一个例子:

    -------------------------

    package demos;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
    
    class Student {
        int age;
        String name;
        Student(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "[" + age + " , " + name + "]";
        }
    }
    
    class myComparator implements Comparator<Student> {
        @Override
        public int compare(Student o1, Student o2) {
            if (o1.age != o2.age) {
                return o1.age - o2.age;
            }
            if (!o1.name.equals(o2.name)) {
                return o1.name.compareTo(o2.name);
            }
            return 0;
        }
    }
    
    class Teacher implements Comparable<Teacher> {
        private int age;
        private String name;
        Teacher(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public int compareTo(Teacher o) {
            if (age != o.age) {
                return age - o.age;
            }
            if (!name.equals(o.name)) {
                return name.compareTo(o.name);
            }
            return 0;
        }
        
        @Override
        public String toString() {
            return "[" + age + " , " + name + "]";
        }
    }
    
    public class ComparaTest {
        public static void main(String[] args) {
            Student s1 = new Student(10, "5li");
            Student s2 = new Student(10, "4wang");
            Student s3 = new Student(16, "3zh");
            Student s4 = new Student(16, "2omg");
            Student s5 = new Student(19, "1hehe");
    
            // 比较器是必须的,否则抛异常class cannot be cast to java.lang.Comparable
            Set set = new TreeSet(new myComparator());
            set.add(s5);
            set.add(s4);
            set.add(s3);
            set.add(s2);
            set.add(s1);
            System.out.println(set);
    
            Teacher t1 = new Teacher(10, "5li");
            Teacher t2 = new Teacher(10, "4wang");
            Teacher t3 = new Teacher(16, "3zh");
            Teacher t4 = new Teacher(16, "2omg");
            Teacher t5 = new Teacher(19, "1hehe");
            List l = new ArrayList();
            l.add(t5);
            l.add(t4);
            l.add(t3);
            l.add(t2);
            l.add(t1);
            Collections.sort(l);
            System.out.println(l);
        }
    }

    -------------------------

    end

  • 相关阅读:
    解析excel表格为DataSet
    easyui 上传文件代码
    上传文件后台代码
    easyui dialog
    C++ 强制设置文件大小
    std::function与std::bind
    glog 编译报错 ERROR macro is defined. Define GLOG_NO_ABBREVIATED_SEVERITIES before including logging.h. See the document for detail.
    Qt删除目录
    C++11 中的std::function和std::bind
    TortoiseGit 使用教程
  • 原文地址:https://www.cnblogs.com/luangeng/p/6057556.html
Copyright © 2011-2022 走看看