Java的比较器

Java的比较器

java.lang.Comparable接口

Comparable接口
是一个给排序方法使用的接口, 这是一个自比较器接口。
用于指定一个对象如何去比较大小。

Comparable接口中的方法

int compareTo(T obj) 比较当前对象与传入进来对象的大小

参数:obj 表示要比较的对象返回值:
    *如果当前的对象大于obj,返回正整数。
    *如果当前的对象等于obj,返回0
    *如果当前对象小于obj,返回负整
这是Java的一种约定,
当排序的sort()方法在对集合中的元素两两进行比较的时候会调用我们实现的compareTo(T obj)方法。
如果compareTo()返回正整数,则表示当前元素大于和它比较的元素;
如果返回负整数则表示当前元素小于和它比较的元素;
如果返回0,则表示两者相等。

案例演示

案例需求:

在数组中有三个员工对象,员工包含三个属性:编号、姓名、工资。

我们使用Arrays.sort()方法对数组中的员工按工资从小到大排序。

案例分析:

1)  创建员工实体类,包含属性int id,String name和int salary。

2)  通过员工的构造方法传入三个属性,生成toString()方法,生成无参的构造方法。

3)  员工实现Comparable接口,并且实现compareTo()方法:用当前员工工资减去另一个员工的工资

4)  在main函数中创建三个元素的数组,并且创建三个员工,添加到数组中。

5)  调用Arrays.sort()方法对员工进行排序

6)  思考:如果要按工资的降序排序如何实现?如果要用id排序呢?

案例代码:

//如果要比较大小,必须实现Comparable接口
class Employee implements Comparable<Employee> {

    private int id;
    private String name;
    private int salary;


   @Override

    public int compareTo(Employee o) {  //告诉sort()方法比较规则
        return o.salary - this.salary;
    }
}

public class Demo03Comparable {

    public static void main(String[] args) {

        Employee[] employees = {
                new Employee(1, "孙悟空",7000),
                new Employee(2, "孙悟天",5000),
                new Employee(3, "孙悟饭",6000),
        };

       System.out.println("排序前:");

        for (Employee employee : employees) {
            System.out.println(employee);
        }

        //排序

        Arrays.sort(employees);

        System.out.println("排序后:");

        for (Employee employee : employees) {
            System.out.println(employee);
        }
    }
}

java.util.Comparator接口

Comparator接口
创建一个比较器的接口,一个类实现这个接口,相当于指定了一个排序的规则。

Comparator接口中的方法

int compare(T obj1, T obj2)  
比较o1和o2这两个对象如果:
    obj1 > obj2,这个方法返回正整数
    obj2 == obj1, 返回0
    obj1 < obj2,这个方法返回负整数

案例演示

需求说明

1)  定义一个学生类,成员变量有:姓名,年龄

2)  创建多个学生对象添加到集合中

3)  创建类Demo04Comparator按年龄从小到大对集合的学生对象进行排序

代码实现


class Student {
    private String name;
    private int age;
    private int score;
}

//年龄比较器
class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getAge() - o2.getAge();
    }
}
//成绩比较器
class ScoreComparator implements Comparator<Student> {
    @Override

    public int compare(Student o1, Student o2) {
        return o1.getScore() - o2.getScore();
    }
}


public class Demo04Comparator {
    public static void main(String[] args) {

        //2)    创建多个学生对象添加到集合中

        List<Student> students = new ArrayList<>();

        students.add(new Student("张三",20,86));

        students.add(new Student("李四",18,95));

        students.add(new Student("老王",24,67));

        System.out.println("排序前:");

        System.out.println(students);

        //3)    创建类Demo04Comparator按年龄从小到大对集合的学生对象进行排序

        Collections.sort(students, new AgeComparator());

        System.out.println("年龄排序后:");

        System.out.println(students);

        //按分数进行排序

        Collections.sort(students, new ScoreComparator());

        System.out.println("分数排序后:");

        System.out.println(students);

    }

}

Comparable和Comparator的区别

Comparable & Comparator 都是用来实现集合中的排序的,
只是 Comparable 是在对象内部定义的方法实现的排序,Comparator 是在集合外部实现的排序。 

1)  Comparable位于包java.lang下,Comparator位于包java.util下。
    Comparable接口将比较代码嵌入自身类中,而Comparable在一个独立的类中实现比较。

2)  如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,
    可以通过Comparator 来实现比较算法进行排序。

3)  Comparator为了使用不同的排序规则做准备。比如:升序、降序或按不同的属性进行排序。

字符串比较大小

字符串比较的规则

比较规则:

从字符串的第1个字符开始比较大小,比较它们的ASCII码值。

1)  大写字母小于小写字母,如:A 65 a 97

2)  所有的数字都小于字母

说出如下字符串的比较结果:

字符串1结果字符串2
"abcde"<"ac"
"abc">"ab"
"ab">"AB"
"1000"<"2"

注:String、Integer、Double、Character、Boolean、Float类都已经实现了Comparable接口

public class Demo04String {

    public static void main(String[] args) {

        String s1 = "1000";

        String s2 = "2";

        String s3 = "4";

        String s4 = "4";

        System.out.println( s1.compareTo(s2));  //-1

        System.out.println( s3.compareTo(s2));  //2

        System.out.println( s3.compareTo(s4));  //0
    }
}

字符串排序案例

案例需求:

有一个字符串数组,包含5个字符串,请按从小到大的顺序输出字符串。

字符串数组如下:"Jack","Rose","make","tom","1000","9"

案例代码:

public class Demo05StringSort {
    public static void main(String[] args) {

        String[] names = {"Jack","Rose","make","tom","1000","9"};

        System.out.println("排序前:");

        System.out.println(Arrays.toString(names));

        Arrays.sort(names);

        System.out.println("排序后:");

        System.out.println(Arrays.toString(names));

        //创建自定义的比较器

        Arrays.sort(names, new Comparator<String>() {

            @Override

            public int compare(String o1, String o2) {

                return o2.compareTo(o1);

            }

        });

        System.out.println("排序后:");

        System.out.println(Arrays.toString(names));
    }
}

展开阅读全文

没有更多推荐了,返回首页