如果你对数据结构和算法都很熟悉,那你大可自己编写高效的排序方法。但是如果你对此不是很熟的话, JDK 中为你提供了非常方便的类: java.util.Arrays 和 java.util.Collection 。
其中,java.util.Arrays 主要是对对象数组进行处理,包括对对象数组填值、查找、比较、排序等。而 java.util.Collection 也具有同样的功能,只是它所处理的对象是对象链表。而且它们的这些方法都是静态的,可以直接调用。下面是具体的例子:
//给对象数组排序
Object[] objects = getObjectArray(); //取得你要排序的对象数组
Arrays.sort( objects );
//给对象链表排序
List objectList = getObjectList(); //取得你要排序的对象链表
Collections.sort( objectList );
注意:使用上述方法时,对象数组或对象链表中的对象必须实现接口:java.lang.Comparable
用这样方法就可以完成非常高效的排序方法。对于 Arrays 和 Collections 更为详细的使用方法请参阅 JDK 文档。
//
一个会排序的Vector
在<<thinking in java>>中看到一段拍案叫绝的代码!起名叫:会排序的Vector
代码如下:
import java.util.*;
interface Compare {
boolean lessThan(Object lhs, Object rhs);
boolean lessThanOrEqual(Object lhs, Object rhs);
}
class SortVector extends Vector {
private Compare compare; // To hold the callback
public SortVector(Compare comp) {
compare = comp;
}
public void sort() {
quickSort(0, size() - 1);
}
// 快速排序
private void quickSort(int left, int right) {
if(right > left) {
Object o1 = elementAt(right);
int i = left - 1;
int j = right;
while(true) {
while(compare.lessThan(
elementAt(++i), o1));
while(j > 0)
if(compare.lessThanOrEqual(elementAt(--j), o1))
break; // out of while
if(i >= j) break;
swap(i, j);
}
swap(i , right);
quickSort(left, i-1);
quickSort(i+1, right);
}
}
//交换位置
private void swap(int loc1, int loc2) {
Object tmp = elementAt(loc1);
setElementAt(elementAt(loc2), loc1);
setElementAt(tmp, loc2);
}
}
public class StringSortTest {
// 自定义比较规则
static class StringCompare implements Compare {
public boolean lessThan(Object l, Object r) {
return ((String)l).toLowerCase().compareTo(
((String)r).toLowerCase()) < 0;
}
public boolean
lessThanOrEqual(Object l, Object r) {
return ((String)l).toLowerCase().compareTo(
((String)r).toLowerCase()) <= 0;
}
}
public static void main(String[] args) {
SortVector sv =
new SortVector(new StringCompare());
// 添加Element
sv.addElement("d");
sv.addElement("A");
sv.addElement("C");
sv.addElement("c");
// 排序
sv.sort();
Enumeration e = sv.elements();
// 输出结果
while(e.hasMoreElements())
System.out.println(e.nextElement());
}
}
代码详解:
因为我们要做一个会排序的Vector,所以class SortVector extends Vector.
interface Compare的作用是定义统一的比较大小的接口.
注意class StringCompare ,在它里面定义了String比较大小的规则, 以后我们如何想写个XXXXVector, 只要在写个class XXXXXCompare implements Compare就好了.
这段代码经典地显示了接口的用法,同时启发我们如何规划类的继承关系.