Java中的排序
对数组排序
简单排序
java.util.Arrays
类中重载了很多排序方法。可以对 byte[]
、char[]
、double[]
、float
、int[]
、long[]
等类型进行排序。
例如,执行
1 | import java.util.Arrays; |
输出:
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 | // 生成一个自然排序逆序 Comparator |
此外还有,Comparator.naturalOrder()
、Comparator.comparingDouble()
等静态方法。
对ArrayList排序
对ArrayList<String>或者ArrayList<Integer>等类型排序
对ArrayList<String>或者ArrayList<Integer>等类型排序,以及其他基本数据类型的装箱类型,可以直接使用
1 | ArrayList<String> array = new ArrayList<String>(); |
或
1 | ArrayList<Integer> array = new ArrayList<String>(); |
对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.