Java中的比较器

面试题:试比较Comparable和Comparator的区别?

  1. 如果对象数组需要排序,那么就必须设置排序规则,就要使用这两种比较器

  2. 对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个有compareTo()方法,只有一个参数,返回值为int,返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等

  3. 对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现

对于jdk1.8而言,有三种实现对象比较的方法:

  1. 覆写Object类的equals()方法;

  2. 继承Comparable接口,并实现compareTo()方法;

  3. 定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。

实践举例:

通过使用比较器,将学生对象的内容进行排序,并输出

第一种情况:使用Comparable比较器,实现Comparable接口,并重写compareTo方法,通过调用Collections.sort()来实现排序

定义Student类实现Comparable接口

public class Student implements Comparable<Student>{

    private int num;

    private String name;

    private double scores;

//生成构造

    public Student(int num1,String name1,double scores1) {

        num = num1;

        name = name1;

        scores = scores1;

    }

    public int getNum() {

        return num;

    }

    public void setNum(int num) {

        this.num = num;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public double getScores() {

        return scores;

    }

    public void setScores(double scores) {

        this.scores = scores;

    }

    @Override

    public String toString() {

        return "Student [num=" + num + ", name=" + name + ", scores=" + scores + "]";

    }

    public int compareTo(Student s) {

        int i = (int) (this.getScores()-s.getScores());

        return i;

    }

    

}

 

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class Test1{

    public static void main(String[] args) {

        // 定义一个List集合,向集合中加入五个学生对象,使用比较器将内容排序输出

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

        list1.add(new Student(001,"tiffany",100000.0));

        list1.add(new Student(002,"jeff",20000.0));

        list1.add(new Student(003,"sarah",30000.0));

        list1.add(new Student(004,"hanmm",40000.0));

        list1.add(new Student(005,"ella",10000.0));

//      Arrays.sort(list1, new StudentComparator());

        Collections.sort(list1);

        for (Student s : list1) {

            System.out.println(s.getNum()+" "+s.getName()+" "+s.getScores());

        }

        

    }

}

 

 

第二种情况:使用Comparator比较器来实现。重新定义一个StudentComparator类实现Comparator接口,并重写里面的compare方法,在测试方法中依然调用Collections.sort( , )来实现对集合进行排序

//根据学号进行排序

importjava.util.Comparator;

public class StudentComparator implements Comparator<Student >{

    @Override

    public int compare(Student o1, Student o2) {

        // TODO Auto-generated method stub

        return (int) (o1.getNum()-o2.getNum());

    }

    

}

 

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class Test1{

    public static void main(String[] args) {

        // 定义一个List集合,向集合中加入五个学生对象,使用比较器将内容排序输出

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

        list1.add(new Student(001,"tiffany",100000.0));

        list1.add(new Student(003,"jeff",20000.0));

        list1.add(new Student(007,"sarah",30000.0));

        list1.add(new Student(004,"hanmm",40000.0));

        list1.add(new Student(005,"ella",10000.0));

//      Arrays.sort(list1, new StudentComparator());

        Collections.sort(list1, new StudentComparator());

        for (Student s : list1) {

            System.out.println(s.getNum()+" "+s.getName()+" "+s.getScores());

        }

        

    }

}

这两种情况都是调用了Collections.sort方法,只是参数不同,注意区分

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值