comparable和comparator

Posted OUYM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了comparable和comparator相关的知识,希望对你有一定的参考价值。

1概述

java中,对集合对象或者数组对象排序,有两种实现方式:

实现排序接口comparable

定义比较器comparator

下面用一个例子介绍上述两种实现方式

 

2实现comparable接口

我们先看一下Comparable的源码

public interface Comparable<T> {
  
    public int compareTo(T o);
}

就一个compareTo方法。

定义一个Student类并实现Comparable接口

public class Student implements Comparable<Student>{
    
    private String name;
    private int age;
    
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student s) {
        // TODO Auto-generated method stub
        return this.age-s.age;
    }
    
    public String toString(){
        return name+":"+age;
    }

}

该类实现Comparable接口的唯一方法compareTo,A.compareTo(B)返回值大于0时,表示A大于B,等于0表示A等于B,小于0表示A小于B。这里是通过student的age属性来进行比较。

然后新建一个测试类Test

 

public class Test {

    public static void main(String[] args) {
        
        List<Student> students = new ArrayList<>();
        students.add(new Student("ouym1",20));
        students.add(new Student("ouym2",22));
        students.add(new Student("ouym3",21));
        for(Student s : students){
            System.out.println(s.toString());
        }
        System.out.println("---------------sort--------------");
        Collections.sort(students);
        for(Student s : students){
            System.out.println(s.toString());
        }
        

    }

}

 

先向List中添加三个Student对象,然后按ArrayList的顺序输出(添加顺序),接下来调用Collections.sort(students)排序,我们看一下排序后的List。

ouym1:20
ouym2:22
ouym3:21
---------------sort--------------
ouym1:20
ouym3:21
ouym2:22

按照age升序。若想要降序只需要将compareTo中的this.age-s.age变为s.age-this.age即可。

 

3定义比较器comparator

还是上面那个例子,Student类添加get和set方法,接下来我们定义一个comparator的实现类

public class MyComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        // TODO Auto-generated method stub
        return o1.getName().compareTo(o2.getName());
    }

}

下面是测试类Test

public class Test {

    public static void main(String[] args) {
        
        List<Student> students = new ArrayList<>();
        students.add(new Student("ouym1",20));
        students.add(new Student("ouym3",22));
        students.add(new Student("ouym2",21));
        
        Collections.sort(students,new MyComparator());
        for(Student s : students){
            System.out.println(s.toString());
        }
        
    }

}

输出

ouym1:20
ouym2:21
ouym3:22

MyComparator比较器按照name升序排列。

 

以上是关于comparable和comparator的主要内容,如果未能解决你的问题,请参考以下文章

集合排序Comparator和Comparable

错误记录Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )

常用的比较器:实现方式Compareable和Comparator

java排序问题,comparator接口,求高手

beyond compare 回车换行符比较规则

似懂非懂的Comparable与Comparator