! f# S# N/ {5 aimport java.util.*; 3 ], H& |( R. ?9 u$ rpublic class Sort{ ! A+ r; T6 S2 |9 ~9 P public static void main(String[] args){ ! W0 D7 r2 z9 ]4 B: M: H
int[] intArray = new int[] {4, 1, 3, -23}; - E" O2 M+ @/ Q. B& L- Q8 @
Arrays.sort(intArray); ) C" X. E1 J3 z% Q) F
} * k& c1 m& V' {
} $ V; Q0 X8 E. r3 T9 B2 s; T' ~ q这样我们就用Arrays的静态方法sort()对intArray进行了升序排序,现在数组已经变成了{-23,1,3,4}." z6 h, U* u& P; }4 X+ y
# C7 l3 \; @4 W9 i4 x8 x+ }) @8 x8 s
如果是字符数组:: C! ]) J3 \! W# C" Z( C9 r5 X
- [4 M$ U; s+ l0 ~* `- f
String[] strArray = new String[] {"z", "a", "C"}; 7 p0 M W$ h% a/ W. D& D) e
我们用:% B" d# c' H q; s3 O: I* b
0 a! ~ p3 P+ M2 \6 `+ ^, O$ y5 J4 A
Arrays.sort(strArray); 1 ^! ~ ^1 ~# }4 r) z0 S进行排序后的结果是{C,a,z},sort()会根据元素的自然顺序进行升序排序。如果希望对大小写不敏感的话可以这样写: 4 F. Q# s# N/ N0 t; ^0 D' L* R% f9 x! Y: r! G$ u) ]
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); ; r1 x! Y$ }5 T; C; I; ?当然我们也可以指定数组的某一段进行排序比如我们要对数组下表0-2的部分(假设数组长度大于3)进行排序,其他部分保持不变,我们可以使用: 7 D: I1 v; ]) s: w/ q # n6 p) y& R. J( O4 tArrays.sort(strArray,0,2); 6 |( o* V- K* s% M/ F+ C/ d, K! c
这样,我们只对前三个元素进行了排序,而不会影响到后面的部分。 # F! q* }% u& A& D% x' T2 ] 6 v$ h5 n2 F$ v7 s% N% y$ M3 a' W当然有人会想,我怎样进行降序排序?在众多的sort方法中有一个: }" ^! T3 g/ }0 v* ?! x
& J% a, j! p) u; A3 R+ Qsort(T[] a, Comparator<? super T> c) 8 t, a, a3 G9 j6 l2 `我们使用Comparator获取一个反序的比较器即可,Comparator会在稍后讲解,以前面的intArray[]为例:; T5 P3 u8 `9 I+ D: K! a
$ [& c; J. t A* B8 q! \: S8 y; }
Arrays.sort(intArray,Comparator.reverseOrder()); # L$ j. m |# t# `5 @" G
这样,我们得到的结果就是{4,3,1,-23}。如果不想修改原有代码我们也可以使用:6 B- X7 j( P8 N5 a
, g% D0 v: b+ v" ^Collections.reverse(Arrays.asList(intArray)); * m+ V. M) q5 l1 }5 W/ d/ B得到该数组的反序。结果同样为4,3,1,-23}。 [0 r' `+ F+ G) S$ z1 K F7 _/ P' ]5 P: m3 X( v现在的情况变了,我们的数组里不再是基本数据类型(primtive type)或者String类型的数组,而是对象数组。这个数组的自然顺序是未知的,因此我们需要为该类实现Comparable接口,比如我们有一个Name类: ) z% ^* a1 a V6 T' R : w! ]0 b* ^0 z! D: Bclass Name implements Comparable<Name>{ 0 T& d! ~0 h5 I. F9 {+ q- ]. A public String firstName,lastName; + }" L. F- T+ Y! L+ _% `6 ^! H public Name(String firstName,String lastName){ 3 p) m8 k6 U0 C: _3 X7 t- i
this.firstName=firstName; ; m* U; N# p) t1 v9 s1 S this.lastName=lastName; 2 k: k( N* K& w( K% V* W: l/ l* o } 4 Z6 D o1 ^' K public int compareTo(Name o) { //实现接口 , H7 t2 o. Z3 M- k% Y6 o( n5 R- C int lastCmp=lastName.compareTo(o.lastName); - P2 n1 }/ X }# e+ \- e* S
return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName)); # w" ?& O* F- t: @, s9 A8 ~) l
} & p. K& W6 o( O" [1 h
public String toString(){ //便于输出测试 * Y( C/ s9 T, y! X1 z/ ]0 K: h; e
return firstName+" "+lastName; : l; o ]; _6 u" d! m8 X6 Z0 w } G$ n, P+ @) l+ m" s* ^6 R* o
} + `9 V- q+ n/ r7 Q7 q
这样,当我们对这个对象数组进行排序时,就会先比较lastName,然后比较firstName 然后得出两个对象的先后顺序,就像compareTo(Name o)里实现的那样。不妨用程序试一试:% o* g5 |6 B( G+ G" S- Y! X
6 ~9 {( |" B2 S% R! V import java.util.*; $ \3 U* \. G) _; p$ s
public class NameSort { + @' T5 t5 J: L' Z& U6 c9 p2 r$ N public static void main(String[] args) { + L# S$ D* {, N- Q Name nameArray[] = { $ z' w8 q$ f. V- M; s) S new Name("John", "Lennon"), $ I+ Y8 w" v) Q# y! W* ~" Q5 ?. ] new Name("Karl", "Marx"), 8 z t2 R# C6 h/ H) J6 D6 N8 ]
new Name("Groucho", "Marx"), % m9 e( W1 m! H) v* m
new Name("Oscar", "Grouch") " `" P0 I5 E, z
};