问题的描述:
排序的用法
解决方案:
对于复杂的应用,尤其是生成报表时,排序是一种必不可少的基本操作。在Java 2 Collections API中,已经实现了几种排序。
给数组排序可以使用Arrays对象的一套sort方法。
对于boolean以外的基本类型,Arrays.sort有两种变化:
Arrays.sort(<type> array[])用来为整个数组排序。
Arrays.sort(<type> array[], int fromIndex, int toIndex)用来为数组的一部分排序。
对于引用类型,Arrays.sort有四种种变化:
Arrays.sort(Object array[])用默认的比较器为整个数组排序。
Arrays.sort(Object array[], int fromIndex, int toIndex)用默认的比较器为数组的一部分排序。
Arrays.sort(Object array[], Comparator comparator)使用指定得比较器为整个数组排序。
Arrays.sort(Object array[], int fromIndex, int toIndex, Comparator comparator)使用指定得比较器为数组的一部分排序。
由于排序算法必须比较两个对象,所以使用Arrays.sort方法时要传递比较器参数。比较器有两种类型:一种是实现Comparable接口的, 另一种是实现Comparator接口的。
Comparable接口定义了一个方法:int compareTo(element, Object)。这个方法比较 Object 与element。如果Object小于element,则返回负值;如果Object大于element,则返回正值;如果Object等于element,则返回零。
Comparator接口定义了两个方法:
compare(e1 : Object , e2 : Object ) :int。如果e1小于e2,则返回负值;如果e1大于e2,则返回正值;如果e1等于e2,则返回零。
equals(object : Object) : boolean。用于判断两个比较器对象是否相等。该方法在继承Object类时已经被实现。
请看下例:
import java.util.*;
public class TestCompareable1 {
public static void main(String[] args) {
Cat[] c = new Cat[5];
for (int i = 0; i < c.length; i++) {
c[i] = new Cat((int) (Math.random() * 100));
// 随机生成一个整数,作为猫对象的属性值,以区分不同的对象
System.out.println(c[i]);
}
Arrays.sort(c);
System.out.println("----------------");
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
}
}
class Cat implements Comparable {
int w = 0;
public Cat(int i) {
w = i;
}
public String toString() {
return "Cat: " + w;
}
public int compareTo(Object o) {
Cat c = (Cat) o;
if (this.w == c.w) // 相等的话返回0
{
return 0;
} else if (this.w > c.w) // 大于的话返回正数
{
return 6;
} else
return -3; // 小于的话返回负数
}
}
输出结果如图
也可以定义动态的比较器,如下事例:
import java.util.*;
public class TestCompareable2 {
public static void main(String[] args) {
Cat[] c = new Cat[5];
for (int i = 0; i < c.length; i++) {
c[i] = new Cat((int) (Math.random() * 100));
// 随机生成一个整数,作为猫对象的属性值,以区分不同的对象
System.out.println(c[i]);
}
Arrays.sort(c, new Comparator() // 匿名类实现
{
public int compare(Object o1, Object o2) {
Cat c1 = (Cat) o1;
Cat c2 = (Cat) o2;
if (c1.w > c2.w) // 如果大于的话返回正数
return 4;
else if (c1.w < c2.w)
return -2; // 小于的话返回负数
else
return 0; // 相等的话返回0
}
/*
* 注意该接口还有一个方法叫 equals(Object o)方法在
* 这里并没有实现,也会通过,原因是Object类也有那个方法 所以每个类都有该方法。
*/
});
System.out.println("----------------");
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
}
}
class Cat {
int w = 0;
public Cat(int i) {
w = i;
}
public String toString() {
return "Cat: " + w;
}
}
输出结果如图