Java中的排序

对数组排序

简单排序

java.util.Arrays 类中重载了很多排序方法。可以对 byte[]char[]double[]floatint[]long[] 等类型进行排序。

例如,执行

1
2
3
4
5
6
7
8
9
import java.util.Arrays;

public class Main {
public static void main(String[] args) {
int[] array = {3, 2, 6, 9, 5, 8, 4, 7};
Arrays.sort(array);
System.out.println(Arrays.toString(array));
}
}

输出:

1
[2, 3, 4, 5, 6, 7, 8, 9]

还有更多重载的 sort() 方法,请看 Arrays - Java Docs

补充知识

Arrays.sort() 方法实际上使用的是QuickSort,具体一点是DualPivotQuicksort,感兴趣可以查一下源代码。

高级排序

使用 Comparator

Comparator只能用于对象类型的数据,不能应用于基本类型。

有人写了一种可以对基本类型使用的 Comparator:https://github.com/mintern-java/primitive

使用官方Comparator

比如,上边是把数组按照顺序排列,如果想要倒序排列应该怎么办呢?可以这样做:

1
Arrays.sort(array, Collections.reverseOrder());

Collections.reverseOrder() 会返回一个Comparator对象。用来进行逆序排列。

自己编写 Comparator

生成 Comparator

常见方式:

1
2
3
4
5
6
7
8
// 生成一个自然排序逆序 Comparator
Comparator.reverseOrder();

// 一个根据 Object 的 hashCode 方法的返回值进行比较的 Comparator
Comparator<Object> hashCodeComparator = Comparator.comparing(Object::hashCode);

// 使用 reversed() 可以变更顺序
Comparator<Object> reversedHashCodeComparator = Comparator.comparing(Object::hashCode).reversed();

此外还有,Comparator.naturalOrder()Comparator.comparingDouble() 等静态方法。

对ArrayList排序

对ArrayList<String>或者ArrayList<Integer>等类型排序

对ArrayList<String>或者ArrayList<Integer>等类型排序,以及其他基本数据类型的装箱类型,可以直接使用

1
2
3
4
5
ArrayList<String> array = new ArrayList<String>();
Array.add("C");
Array.add("B");
Array.add("A");
Collections.sort(array);

1
2
3
4
5
ArrayList<Integer> array = new ArrayList<String>();
Array.add(3);
Array.add(2);
Array.add(1);
Collections.sort(array);

对ArrayList<Object>排序

如果ArrayList中存放的不是常用的数据类型,而是其他的对象,怎么排序呢?

这个时候,要排序的对象必须实现了Comparable接口,或者通过自己编写Comparator来实现排序。

两者的区别

通过Comparable是直接把比较规则写在了对象中,只能有一种排序规则。

如果想有多种排序规则,比如根据对象不同的域来选择排序规则,就需要使用Comparator。

通过Comparable接口

把要排序的对象声明为实现 Comparable 接口,然后重写 compareTo() 方法,确定比较规则。

通过Comparator接口

按照后缀数字排序(文件名排序)

对字符串排序的时候,默认是按照字典序排序,即对 文件1文件2文件10文件20 排序,排序结果是 文件1文件10文件2文件20

如果希望按照最后的数字进行排序,应该如何处理呢?

目前只能自己写自定义的 Comparator,把字符串最后的数字抽取出来再进行比较。

How to Order Versioned File Names Semantically in Java – Java, SQL and jOOQ.

参考资料

  1. Collections - Java Docs
  2. Java ArrayList of Object Sort Example (Comparable And Comparator)