双非本科准备秋招(9.1)——重学排序与自定义比较

之前对排序的使用一直没系统学习,这次好好学一遍。

前言

JAVA中使用排序大致分为两种:

  • 一种是Arrays的sort()方法,可根据各种数据类型(基本与引用类型)数组排序。
  • 一种是Collections的sort(),针对集合进行排序(例如ArrayList、TreeMap等)

但是如果我们想要自定义排序规则时,就需要用到两个接口。

  • Comparable接口,出自java.lang,需要重写compareTo(Object obj)方法
  • Comparator接口,出自java.util,需要重写compare(Object obj1, Object obj2)方法

先分别介绍一下,再进行比较。

Comparable

源代码,去掉注释后:

package java.lang;
import java.util.*;
public interface Comparable {
    public int compareTo(T o);
}

可见源码非常短,只提供了一个方法compareTo(T o),返回值是int。

比较规则:

1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

2、比较者等于被比较者,那么返回0

3、比较者小于被比较者,那么返回负整数

使用方法如下,会输出倒序排序:

public class test {
    public static void main(String[] args) {
        ArrayList list = new ArrayList<>();
        list.add(new student1("smMid", 12));
        list.add(new student1("smBig", 18));
        list.add(new student1("smTiny", 6));
        Collections.sort(list);
        for (student1 student1 : list) {
            System.out.println(student1.toString());
        }
    }
}

class student1 implements Comparable{
    String name;
    int age;

    public student1(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(student1 o) {
        return o.age - this.age;
    }

    @Override
    public String toString() {
        return "student1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Comparator

双非本科准备秋招(9.1)——重学排序与自定义比较_第1张图片

它是一个功能型接口,往往搭配匿名内部类使用。

        Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,分别表示待比较的两个对象,方法返回值是int,有三种情况:

1、o1大于o2,返回正整数

2、o1等于o2,返回0

3、o1小于o2,返回负整数

使用方法如下,我们通过匿名内部类的方式,重写compare方法,这里会输出逆序。

public class test {
    public static void main(String[] args) {
        ArrayList list = new ArrayList<>();
        list.add(new student2("smMid", 12));
        list.add(new student2("smBig", 18));
        list.add(new student2("smTiny", 6));

        Collections.sort(list, new Comparator() {
            @Override
            public int compare(student2 o1, student2 o2) {
                return o2.age - o1.age;
            }
        });

        for (student2 student2 : list) {
            System.out.println(student2);
        }
    }
}
class student2{
    String name;
    int age;

    public student2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "student2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

二者比较

comparable的使用方式是类继承comparable接口,在类中重写compareTo方法;

comparator的使用方式是作为比较器参数,传入例如Collections.sort()方法中。

二者功能一样,但是当我们无法修改类的时候,我们就只能用comparator,比如说给TreeMap指定排序规则,我们无法修改源码,那就只能使用comparator进行排序。

你可能感兴趣的:(java,求职招聘)