自然排序与定制排序

目录

自然排序 

定制排序

自然排序和定制排序对比 


这里提到的两种排序,并不是算法中快速排序,归并排序这种类型的排序算法,只是为了实现对象排序而实现的方法。一般用于集合中对对象的排序。

自然排序 

        自然排序是一种默认的对象排序方式,它是根据对象的内在特征或属性来排序的。例如,对于整数,自然排序是按照数字的大小进行排序;对于字符串,自然排序是按照字母的字典顺序进行排序。自然排序通常是最直观和常见的排序方式,它使得对象在集合中以一种有序的方式存储和检索。我们自定义的对象想要实现自然排序,就得实现Comparable接口,该接口中只提供了一个方法:compareTo(Object obj), 该方法的返回值是int。如果返回值为正数,则表示当前对象(调用该方法的对象)比obj对象“大”;反之“小”;为零则表示两对象相等。示例如下:

public class Cat implements Comparable{
    private int age;

    public Cat(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Object o) {
        if(o instanceof Cat){
            Cat cat=(Cat) o;
            return age-cat.age;
        }
        return 0;
    }
}

        Cat 类中有一个age属性,我们重写了compareTo方法,让比较两个Cat对象成比较两个Cat对象的age大小。实现了Comparable接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

定制排序

        当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较;重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返 回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort), 从而允许在排序顺序上实现精确控制。 示例如下:

public class Cat {
    private int age;

    public Cat(int age) {
        this.age = age;
    }

    public static void main(String[] args) {
        Cat cat1=new Cat(2);
        Cat cat2=new Cat(4);
        List<Cat> list=new ArrayList();
        list.add(cat2);
        list.add(cat1);
        list.sort(new Comparator<Cat>() {
            @Override
            public int compare(Cat o1, Cat o2) {
                return o1.age-o2.age;
            }
        });
        System.out.println(list.get(0).age);
    }
}

可以看到,我们先把age=4的对象放入了数组

经过排序后输出结果为:

自然排序和定制排序对比 

自然排序于某个类的内部写定,是的这一整个类型的所有对象都可以(默认)按照这个规则来比较大小;而定制排序则是在某次比较中声明的函数,其优先级高于自然排序。

两者的核心代码如上,都遵循这样的规则:返回值为正数,则需要调整次序;返回这为负数,则无需调整次序;返回值为0表示两者相等。

当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值