根据约定,在使用java编程的时候应尽可能的使用现有的类库,当然你也可以自己编写一个排序的方法,或者框架,但是有几个人能写得比JDK里的还要好呢?使用现有的类的另一个好处是代码易于阅读和维护,这篇文章主要讲的是如何使用现有的类库对数组和各种Collection容器进行排序,(文章中的一 部分例子来自《Java Developers Almanac 1.4》) i) R. {- C) `# e
$ A" c8 i- j( q5 Y' N例子中都要加上import java.util.*和其他外壳代码,如类和静态main方法,我会在第一个例子里写出全部代码,接下来会无一例外的省略。9 L6 i# W4 V- u0 U. b8 e
3 U2 N0 q8 y7 @+ C. e对数组进行排序. y4 r! T0 ~' F% C5 N$ n% P' v
# T: {; M# C6 w- ~ S) ~; A比如有一个整型数组:) J# I; {& q' s$ B9 V# }4 ~2 f$ x! m
: N% i7 u4 K8 v2 N n
int[] intArray = new int[] {4, 1, 3, -23}; ' F# `" n0 [) n/ b* w9 R我们如何进行排序呢?你这个时候是否在想快速排序的算法?看看下面的实现方法: ; `5 b0 U; _) E, D- H$ P5 Y* A* O$ m- d! a% d, e9 ~
import java.util.*; \6 l9 F4 a4 a0 A' h, ]
public class Sort{ ( v: |( B2 U4 m3 B. a public static void main(String[] args){ & Q `8 O" F+ D4 B4 ?8 g# w int[] intArray = new int[] {4, 1, 3, -23}; ! ]0 H. L+ N5 b: s Arrays.sort(intArray); ; T7 |( W7 G% y; L: ] } ' D* h: m, ?+ K' d) _( k( ~/ L. ^} \4 y! `0 ?( C' G% o1 Q# G0 K- A这样我们就用Arrays的静态方法sort()对intArray进行了升序排序,现在数组已经变成了{-23,1,3,4}. - ?- ?. }; M9 z5 ?) C8 Q' } / t$ y$ b8 y3 J; H$ _: V如果是字符数组: ; e1 R: o- v, ]; N/ x3 Q& j0 H5 s& ?1 B( S0 Y) o8 ?3 W/ N
String[] strArray = new String[] {"z", "a", "C"}; ( R, ^- p' f4 _1 [我们用:/ E- S; k* ^* f% s2 k5 Z
% y% o# N% K _ Z4 j) U
Arrays.sort(strArray); ) F0 C2 S$ y& L+ _# T4 W
进行排序后的结果是{C,a,z},sort()会根据元素的自然顺序进行升序排序。如果希望对大小写不敏感的话可以这样写:$ } Y4 @2 | ?: D1 ^+ G; O. D, e
8 Q. x9 b$ [% \! @) U9 l; k
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); ! a% j/ K* D3 ]: h8 R8 `6 K7 b( c/ n当然我们也可以指定数组的某一段进行排序比如我们要对数组下表0-2的部分(假设数组长度大于3)进行排序,其他部分保持不变,我们可以使用: ) X: {! A4 L2 T- Y* r8 Y0 b' D& G# N# u
Arrays.sort(strArray,0,2); 0 z# g+ d3 D2 E% h9 Q- Q. D4 z
这样,我们只对前三个元素进行了排序,而不会影响到后面的部分。 , G% \) `6 z$ J3 _8 K- ^* Z, \9 e0 [
当然有人会想,我怎样进行降序排序?在众多的sort方法中有一个$ s5 j; E$ {/ D; F
3 G* t5 Y, C% R7 r4 V5 tsort(T[] a, Comparator<? super T> c) ! U; j+ s6 g, W我们使用Comparator获取一个反序的比较器即可,Comparator会在稍后讲解,以前面的intArray[]为例:) S& |" J# z' D+ t: z
( ?$ X& y0 D1 k1 \/ O5 H& VArrays.sort(intArray,Comparator.reverseOrder()); - q4 t. A7 p. i% o
这样,我们得到的结果就是{4,3,1,-23}。如果不想修改原有代码我们也可以使用: % K$ ?( c! a$ z" A% e6 m- i7 Q! \: i. R! J Q
Collections.reverse(Arrays.asList(intArray)); ) i+ D+ Z9 ]8 O; [
得到该数组的反序。结果同样为4,3,1,-23}。 I/ ^# y4 n- a5 `3 y- U1 ]4 X9 ] * V, T @* V0 I8 [7 j* u现在的情况变了,我们的数组里不再是基本数据类型(primtive type)或者String类型的数组,而是对象数组。这个数组的自然顺序是未知的,因此我们需要为该类实现Comparable接口,比如我们有一个Name类: . z1 A$ l% P t8 F9 Y/ z ~/ Z - l, E4 `. Z- d) Bclass Name implements Comparable<Name>{ " E6 W8 J8 R' p
public String firstName,lastName; ' t# t. h U6 I% A v9 [3 n public Name(String firstName,String lastName){ 7 `# [4 Y2 _1 ?. v9 M
this.firstName=firstName; 0 s* M9 @( b6 ?
this.lastName=lastName; ! |( R3 b0 V) t6 F$ ]$ k( [
} * ]5 W" u# b* x+ h3 X) H. r p# Y6 } public int compareTo(Name o) { //实现接口 $ _0 a- @: ^& u. y9 S
int lastCmp=lastName.compareTo(o.lastName); 0 D; _$ c/ D5 Z8 w* A# } return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName)); 3 n- q% ~7 @& B: a } ( o2 ?3 i, A+ p0 ]8 F! [- b
public String toString(){ //便于输出测试 3 P' R2 C N1 c: Z return firstName+" "+lastName; $ B% l( ^: h5 [: ]
} # x! k1 O% }5 n/ Z1 i} * r2 K ~2 f# i( f$ |
这样,当我们对这个对象数组进行排序时,就会先比较lastName,然后比较firstName 然后得出两个对象的先后顺序,就像compareTo(Name o)里实现的那样。不妨用程序试一试:4 L# A" O4 ]$ ~
. r9 k3 G$ |% f; ~3 E2 T import java.util.*; . p$ \" a' A% S. O7 g ^" ]# \# G public class NameSort { ( p# c. J6 [& {& Q' {
public static void main(String[] args) { 7 o( M; ?$ ]' L$ A1 `: H Name nameArray[] = { / v9 b5 R0 W' v% f new Name("John", "Lennon"), 8 q- O' p7 U4 v new Name("Karl", "Marx"), F7 l% |8 q& \( C/ R" W. y3 r4 n new Name("Groucho", "Marx"), ) t/ o' C# g& {3 d3 J
new Name("Oscar", "Grouch") , B% t2 S9 r( x# K: i2 h7 u+ Q
};