• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

深入理解Java中的Arrays.sort()方法

Java基础 tiantian 2556次浏览 0个评论 扫描二维码

排序是任何应用程序的常见需求,Java应用也不另外。针对自定义类型的数组而言,JDK中的Arrays工具类提供了一个工具方法:sort(T[], Comparator<? super T> c) ,该方法可以用来方便地排序自定义类型的数组。在官方的JDK文档中,只简单地描述了该方法的功能和使用方法,却没有详细解释其背后隐藏的玄机。本文将逐步深入,带领读者深入理解和掌握这个方法。

深入理解Java中的Arrays.sort()方法

简单用例

在更深一步的解释之前,我们先通过一个示例代码来掌握该方法的正确使用方法。在此示例中,定义了一个使用大小(size)比较Dog对象的比较器(Comparator),而且,我们的sort方法使用了这个自定义的比较器。

class Dog {
int size;

public Dog(int size) {
this.size = size;
}
}

class DogSizeComparator implements Comparator {
@Override
public int compare(Dog dog1, Dog dog2) {
return dog1.size - dog2.size;
}
}

public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog(2);
Dog dog2 = new Dog(1);
Dog dog3 = new Dog(3);

Dog[] dogArray = {d1, d2, d3};
printDogs(dogArray);

Arrays.sort(dogArray, new DogSizeComparator());
printDogs(dogArray);
}

public static void printDogs(Dog[] dogs){
for(Dog d: dogs)
System.out.print(d.size + " " );

System.out.println();
}
}

程序的输出是:

2 1 3
1 2 3

策略模式

熟悉设计模式或者策略模式的读者可能看出来了,这里是一个标准的策略模式。可以说,这个策略模式在这里的运用非常完美。简单地说,策略模式使得应用程序可以在运行时动态选择不同的算法实现。在我们的这里示例中,如果传递给Arrays.sort方法不同的比较器(Comparator),就相当于使用了不同的排序算法来排序数组。基于以上的示例代码,假设你现在希望按照Dog对象的重量(weight),而不是大小(size)来排序Dog数组,你只需要实现一个如下所示的新比较器。

class Dog{
int size;
int weight;

public Dog(int s, int w){
size = s;
weight = w;
}
}

class DogSizeComparator implements Comparator{

@Override
public int compare(Dog o1, Dog o2) {
return o1.size - o2.size;
}
}

class DogWeightComparator implements Comparator{

@Override
public int compare(Dog o1, Dog o2) {
return o1.weight - o2.weight;
}
}

public class ArraySort {

public static void main(String[] args) {
Dog d1 = new Dog(2, 50);
Dog d2 = new Dog(1, 30);
Dog d3 = new Dog(3, 40);

Dog[] dogArray = {d1, d2, d3};
printDogs(dogArray);

Arrays.sort(dogArray, new DogSizeComparator());
printDogs(dogArray);

Arrays.sort(dogArray, new DogWeightComparator());
printDogs(dogArray);
}

public static void printDogs(Dog[] dogs){
for(Dog d: dogs)
System.out.print("size="+d.size + " weight=" + d.weight + " ");

System.out.println();
}
}

程序的输出结果:

size=2 weight=50 size=1 weight=30 size=3 weight=40
size=1 weight=30 size=2 weight=50 size=3 weight=40
size=1 weight=30 size=3 weight=40 size=2 weight=50

可以看到,Comparator 是一个接口,任何实现了该接口的比较器,都可以传递给Arrays.sort方法,从而在运行时改变该方法的排序算法,这就是策略模式的核心理念。

什么是 “super”?

细心的读者可能发现了sort方法的参数是”Comparator<? super T> c”,如果参数是简单“Comparator<T> c”,那么了解泛型的读者,应该完全可以理解其含义。但是,”super”作为泛型里面的一个高级特性,理解起来还是有一定的难度。其实,“<? super T>”意味着该类型既可以是T类型,也可以是T的父类型。为什么会有父类型?答案是:这个方法允许对所有的子类型使用相同的比较器(comparator)。这样的解释可能不是很清晰,我们来直接看示例代码。

class Animal{
int size;
}

class Dog extends Animal{
public Dog(int s){
size = s;
}
}

class Cat extends Animal{
public Cat(int s){
size  = s;
}
}

class AnimalSizeComparator implements Comparator{

@Override
public int compare(Animal o1, Animal o2) {
return o1.size - o2.size;
}
//in this way, all sub classes of Animal can use this
}

public class ArraySort {

public static void main(String[] args) {
Dog d1 = new Dog(2);
Dog d2 = new Dog(1);
Dog d3 = new Dog(3);

Dog[] dogArray = {d1, d2, d3};
printDogs(dogArray);

Arrays.sort(dogArray, new AnimalSizeComparator());
printDogs(dogArray);

System.out.println();

//when you have an array of Cat, same Comparator can be used.
Cat c1 = new Cat(2);
Cat c2 = new Cat(1);
Cat c3 = new Cat(3);

Cat[] catArray = {c1, c2, c3};
printDogs(catArray);

Arrays.sort(catArray, new AnimalSizeComparator());
printDogs(catArray);
}

public static void printDogs(Animal[] animals){
for(Animal a: animals)
System.out.print("size="+a.size + " ");
System.out.println();
}
}

这个代码示例的输出是:

size=2 size=1 size=3
size=1 size=2 size=3

size=2 size=1 size=3
size=1 size=2 size=3

可以看到,对与 Dog 数组和 Cat 数组,我们可以使用同样的 AnimalSizeComparator,因为 Dog 与 Cat 都可以被向上转型到 Animal 之后,再使用比较器进行比较。

总结

通过本文可以发现,一个Arrays.sort方法,背后暗藏了好几个特性:
1. 泛型 :super 关键词
2. 设计模式:策略模式
3. 排序算法:快速排序与归并排序
4. JDK中类似的方法:Collections.sor(List<T> list, Comparator<? super T> c) 。


天天编码 , 版权所有丨本文标题:深入理解Java中的Arrays.sort()方法
转载请保留页面地址:http://www.tiantianbianma.com/java-arrays-sort.html/
喜欢 (4)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址