重写Java中Arrays数组工具类提供的sort()排序函数中的比较器类Comparator的compare()方法!

发布时间 2023-11-17 16:07:30作者: 少玩手机

排序方法是我们日常开发或者写功能函数,或者实现算法时,常调用的方法。
有时甚至,开发人员自己还要写一写排序算法。

今天,我们来修改Java官方提供的Arrays工具类中的静态排序sort()方法。

反问一下,为什么要重写呢? 官方提供的还不够你用?
回答:确实不够用,官方默认是对数字,特别是sort比较的是整型这种数字的大小 从而实现默认的有小到大的升序排序。

而有时候面临的情况,一般有两种:
case1: 需要降序排列
case2:有时候不是针对整型数组 或 数字进行排序 , 我想实现对类对象的排序!

先上源码:

这是一种常见的写法,默认为升序,因为是a-b

点击查看代码
Arrays.sort(a,new Comparator<>(){
		public int compare(int a, int b){
				return a-b;
		}
});

因此如果是需要降序排列,则将a-b改为b-a即可。

分析上述代码,实际上Arrays.sort()中有两个参数,第一个参数是你待排序的数组,第二个参数是Comparator比较器类的一个对象。
因此为了满足我们的排序需求,我们会重新这个类中的compare(type arg1 , type arg2)方法。

举个例子,比如我有一个类,如下:

public class structure{
      int val;
}

//以上述定义的类为类型,定义数组。
structure[] strArray = new structure[5];

//现在我要将上述数组中的structure类的对象根据其中的val属性的大小,
//进行降序排列,请你重写Comparator比较器类,传给数组工具类Arrays的静态方法sort();

//在使用这个Java提供的数组工具类时,需要导包。
import java.util.Arrays;

Arrays.sort(strArray , new Comparator<structure>(){
		public int compare(structure a , structure b)
		{
			return b.val - a.val;
		}
})

总结:

1.Java内置的静态方法Arrays.sort()默认是将数组调整为升序,它的代码中实现了Compareable接口的compare(a,b)方法,该方法用于比较两个元素的大小。
2.而它实现的compare(a,b)方法默认是这样的:若a>b,输出正数;若a<b,输出负数;若a=b,输出0。它的方法体实际代码为:return a-b;
3.若我们将compare(a,b)方法重写,相比原先默认的,将它的输出值的正负符号取反;

上述重写代码中,我们相当于将类的对象实例化和这个Comparator比较器类中的compare方法重写都编写到一起完成。有匿名内部类的意思,这个重写修改,这在那一次使用中有效。
因此,在以后的算法题或编写功能函数需要时,请记住如此操作即可。当然还有非常简便的写法就是使用Lambda表达式进行改写。