简单类型的排序<o:p></o:p>
简单类型不外是byte, char, short, int, long, float, double等数据类型, 这些类型不能放在聚集中,只能使用数组。java.util.Arrays方法提供了对这些类型的sort方法(实际上还有很多其他有用的方法),下面是对一个简单的int数组排序:
int[] arr = {2, 3, 1,10,7,4};<o:p></o:p>
<o:p> </o:p>
System.out.print("before sort: ");<o:p></o:p>
for (int i = 0; i< arr.length; i++)<o:p></o:p>
System.out.print(arr[i] + " ");<o:p></o:p>
System.out.println(); <o:p></o:p>
<o:p> </o:p>
Arrays.sort(arr);<o:p></o:p>
System.out.print("after sort: ");<o:p></o:p>
for (int i = 0; i< arr.length; i++)<o:p></o:p>
System.out.print(arr[i] + " ");<o:p></o:p>
System.out.println(); <o:p></o:p>
输出结果:
before sort: 2 3 1 10 7 4 <o:p></o:p>
after sort: 1 2 3 4 7 10<o:p></o:p>
我们看到排序结果是按照升序排列的,下面的排序都是如此。
<o:p> </o:p>
对象的排序<o:p></o:p>
对象可以放在数组里,同样调用Arrays.sort(Object[] arr)即可;也可以放到聚集里,用java.util.Collections的sort(List list)。注意不是list必须实现List接口而不仅仅是Collection接口。
但是这个类必须实现了java.lang.Comparable接口。这个接口只有一个方法:int compartTo(Object o),当本对象比传入的对象大时,返回一个正整数。 以类Programmer为例:
class Programmer implements Comparable{<o:p></o:p>
private String name;<o:p></o:p>
private String language;<o:p></o:p>
private double pay;<o:p></o:p>
<o:p></o:p>
public Programmer(String name, String language, double pay) {<o:p></o:p>
this.name = name;<o:p></o:p>
this.language = language;<o:p></o:p>
this.pay = pay;<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public int compareTo(Object o) {<o:p></o:p>
Programmer other = (Programmer)o;<o:p></o:p>
return (int)pay - (int)other.pay;<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public String toString(){<o:p></o:p>
return "{name: " + name + ", language: " + language + ", money: " + pay + "}";<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
对其进行排序:
ArrayList list = new ArrayList();<o:p></o:p>
list.add(new Programmer("张三", "C", 12000));<o:p></o:p>
list.add(new Programmer("李四", "Java", 200));<o:p></o:p>
list.add(new Programmer("王五", "C++", 5000));<o:p></o:p>
list.add(new Programmer("钱六", "VB", 3000));<o:p></o:p>
System.out.println("before sort: " + list);<o:p></o:p>
Collections.sort(list);<o:p></o:p>
System.out.println("after sort: " + list); <o:p></o:p>
输出:<o:p></o:p>
before sort: [{name: 张三, language: C, money: 12000.0}, {name: 李四, language: Java, money: 200.0}, {name: 王五, language: C++, money: 5000.0}, {name: 钱六, language: VB, money: 3000.0}]<o:p></o:p>
after sort: [{name: 李四, language: Java, money: 200.0}, {name: 钱六, language: VB, money: 3000.0}, {name: 王五, language: C++, money: 5000.0}, {name: 张三, language: C, money: 12000.0}]<o:p></o:p>
<o:p> </o:p>
够简单吧!查查Comparable的javadoc可以知道,有很多类已经实现了该接口,因此对这些类的排序几行代码就可以搞定。
最近看C#发现其中用System.Array.sort对数组排序,适用于所有实现了IComparable接口的对象,看来微软的借鉴能力还真是强啊!
<o:p> </o:p>
对已有类进行排序<o:p></o:p>
上面的方法有一个问题,就是一个类已经存在了,并且没有实现Comparable接口,使用一个子类进行封装?很麻烦(你可以对下面的例子试试)。还有一种情况就是对一个类没法实现多种排序。以File类为例,它实现了Comparable接口,但是是按照名称排序的。如果要按照大小排序,或者按修改时间排序呢?对这两种情况,使用java.util包的Comparator接口:
Arrays.sort(Object[] arr, Comparator com)
Collections.sort(Object[] arr, Comparator com)
Comparator接口的方法:<o:p></o:p>
public int compare(Object o1, Object o2) 当o1比o2大时返回一个正整数<o:p></o:p>
public boolean equals(Object obj) 判断obj与这个Comparator是否同一个对象<o:p></o:p>
下面使用Comparator对文件实现了按文件大小或修改时间排序:<o:p></o:p>
class FileUtils {<o:p></o:p>
static class CompratorByLastModified implements Comparator {<o:p></o:p>
public int compare(Object o1, Object o2) {<o:p></o:p>
File file1 = (File)o1;<o:p></o:p>
File file2 = (File)o2;<o:p></o:p>
long diff = file1.lastModified() - file2.lastModified();<o:p></o:p>
if (diff > 0)<o:p></o:p>
return 1;<o:p></o:p>
else if (diff == 0)<o:p></o:p>
return 0;<o:p></o:p>
else<o:p></o:p>
return -1;<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
public boolean equals(Object obj){<o:p></o:p>
return true; //简单做法<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
static class CompratorBySize implements Comparator {<o:p></o:p>
public int compare(Object o1, Object o2) {<o:p></o:p>
File file1 = (File)o1;<o:p></o:p>
File file2 = (File)o2;<o:p></o:p>
long diff = file1.length() - file2.length();<o:p></o:p>
if (diff > 0)<o:p></o:p>
return 1;<o:p></o:p>
else if (diff == 0)<o:p></o:p>
return 0;<o:p></o:p>
else<o:p></o:p>
return -1;<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
public boolean equals(Object obj){<o:p></o:p>
return true</st>