该用户从未签到
|
根据约定,在使用java编程的时候应尽可能的使用现有的类库,当然你也可以自己编写一个排序的方法,或者框架,但是有几个人能写得比JDK里的还要好呢?使用现有的类的另一个好处是代码易于阅读和维护,这篇文章主要讲的是如何使用现有的类库对数组和各种Collection容器进行排序,(文章中的一 部分例子来自《Java Developers Almanac 1.4》)+ ]6 W2 X1 M, U
' h) n; u. K$ ? k, h" p
首先要知道两个类:java.util.Arrays和java.util.Collections(注意和Collection的区 别)Collection是集合框架的顶层接口,而Collections是包含了许多静态方法。我们使用Arrays对数组进行排序,使用 Collections对结合框架容器进行排序,如ArraysList,LinkedList等。. \. V: ^9 j8 u, a2 j
2 d- X& O2 Q9 N. U4 l) R例子中都要加上import java.util.*和其他外壳代码,如类和静态main方法,我会在第一个例子里写出全部代码,接下来会无一例外的省略。
! L+ a+ n D+ i3 X7 [9 I" }% e( Y: f5 b: m, i2 j, _* K. e; e1 g! k
对数组进行排序) f1 L- Q C* H% y% W% o
3 @( X3 K% u+ W: m比如有一个整型数组:) S, c- m6 Y* p
( M2 ~4 S. F% @ f" x* O0 X
int[] intArray = new int[] {4, 1, 3, -23}; * p% i, G2 o$ m; _7 e
我们如何进行排序呢?你这个时候是否在想快速排序的算法?看看下面的实现方法:# a, m: O- e$ I+ S! q" [6 ]2 \
$ U7 N6 o8 S# ?7 g; a
import java.util.*;
0 ~7 P$ X3 ~; d! s4 J# H' }: ]public class Sort{
3 e/ h$ b7 O& C; |# X public static void main(String[] args){ % M& q/ o8 e- W8 R; f
int[] intArray = new int[] {4, 1, 3, -23}; ; a8 Q( g$ w- G) I; p$ s; `$ Q7 u4 ?
Arrays.sort(intArray);
/ I+ S3 I4 f; N } 6 ^) ~' a& X9 _8 r+ B( Z
}
# l6 Y5 A" l! a* ~6 N这样我们就用Arrays的静态方法sort()对intArray进行了升序排序,现在数组已经变成了{-23,1,3,4}.9 t5 r& h/ B! v7 s
" x: p! K; M& D) \如果是字符数组:+ e) ^' @: B8 r0 _
0 n; @, |9 @* H8 c' k9 ?# O
String[] strArray = new String[] {"z", "a", "C"}; ' l4 x$ Q. n/ |. B4 w( C( J0 s0 k
我们用:
- r9 J4 N3 v! g/ S+ Y% T* C3 P( o% P1 d4 f5 {
Arrays.sort(strArray);
7 u; e7 T* \0 {2 r进行排序后的结果是{C,a,z},sort()会根据元素的自然顺序进行升序排序。如果希望对大小写不敏感的话可以这样写:* E1 }& R$ U, H3 r
1 h. a; y; y8 d7 ?% \3 SArrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); * _ Z" c+ N1 D' s1 d6 E
当然我们也可以指定数组的某一段进行排序比如我们要对数组下表0-2的部分(假设数组长度大于3)进行排序,其他部分保持不变,我们可以使用:
+ g( Q, N2 @% S) h& Q# j S* P
: d# Z8 _! C/ jArrays.sort(strArray,0,2);
8 l% L7 A" [% U) B这样,我们只对前三个元素进行了排序,而不会影响到后面的部分。
: f( |- u' z+ V! r, N8 \' A. r0 k: U: V2 ?
当然有人会想,我怎样进行降序排序?在众多的sort方法中有一个
0 Z G m4 ~" Q5 |1 K# n) I, |: z! Y# P( F8 k; T
sort(T[] a, Comparator<? super T> c)
& ]3 ?0 E9 L5 r: T我们使用Comparator获取一个反序的比较器即可,Comparator会在稍后讲解,以前面的intArray[]为例:
+ i& c& E5 }# D: `0 S% a( Q
! j9 G& B8 P# y8 Q$ C% _Arrays.sort(intArray,Comparator.reverseOrder()); / A: H% e( I( j, ^+ U: v
这样,我们得到的结果就是{4,3,1,-23}。如果不想修改原有代码我们也可以使用:/ z9 d l- k: x6 g) ~( g- n
" O; Z9 P E$ Z+ U
Collections.reverse(Arrays.asList(intArray));
0 G6 D$ ^) h `) [- N% x得到该数组的反序。结果同样为4,3,1,-23}。5 W4 D- \9 Y; v' R' |
& Q1 j. s3 V% v$ @
现在的情况变了,我们的数组里不再是基本数据类型(primtive type)或者String类型的数组,而是对象数组。这个数组的自然顺序是未知的,因此我们需要为该类实现Comparable接口,比如我们有一个Name类:/ U- ]- {" c! F4 V2 [2 \* H. R
$ b# K0 ^; Z. M+ Bclass Name implements Comparable<Name>{ 2 ?. u/ @# U1 n( ^
public String firstName,lastName;
% g8 B; W; r7 y7 c$ }0 k. \ public Name(String firstName,String lastName){
+ x$ K) ^. q6 Y, y7 m5 c9 ^ this.firstName=firstName; 1 o/ o% m4 ]( d$ V& }( K
this.lastName=lastName; U' i' l0 \2 S* ~- \
} 5 E2 V6 n. J5 K
public int compareTo(Name o) { //实现接口 " j! [. f3 u! \- E
int lastCmp=lastName.compareTo(o.lastName); . \& q. E1 ? q
return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
# W; {+ _# X( n- t- \ }
) E! I8 p; ?+ N public String toString(){ //便于输出测试
# b$ m& [. W- Z8 B0 T return firstName+" "+lastName;
4 ~, q4 |. p3 B& G: c( x1 c" @ }
# P" \* E- D7 ^/ e9 X+ ?2 x/ I}
7 q( F' O( c0 G3 e这样,当我们对这个对象数组进行排序时,就会先比较lastName,然后比较firstName 然后得出两个对象的先后顺序,就像compareTo(Name o)里实现的那样。不妨用程序试一试:
/ y7 ~- s3 \ Q1 h( B
4 P5 f Y! o* H5 c7 G import java.util.*;
3 |# b: W) u \7 ^9 ^% f public class NameSort {
6 B1 }! b3 k% }% Z# \ public static void main(String[] args) {
# q. o6 D2 N. |6 d% o: Y6 @ Name nameArray[] = { }7 x$ B7 V) E+ ^
new Name("John", "Lennon"), + o' g5 `9 [4 F& ~+ ^' W
new Name("Karl", "Marx"),
* F+ ^2 T( a. h new Name("Groucho", "Marx"),
+ `7 j. v3 B9 \8 s- |, S$ ]. f/ l new Name("Oscar", "Grouch") ; h1 t6 {% N; D2 j. E8 n' d% c! V# U
}; |
|