排序涉及对象的大小关系。String类实现了Comparable接口,规定字符串按字典序比较大小。而对于非字符串的其他数据,创建对象的类必须实现Comparable接口,即实现接口中的方法int compareto(Object b)来规定对象的大小关系,原因是sort方法在排序时需要调用名为compareTo的方法比较对象的大小关系。无论是collection类的static sort(List<T> list)方法还是Arrays类的static sort(T[] a)都是面向Comparable接口设计的。
总之涉及排序,就要实现Comparable接口,并重写compareTo方法,默认升序,a.compareTo(b)<0时,a<b,=0时相等,大于0时则a>b。
树集节点的排列和链表不同,不按添加的先后顺序排列。树集用add方法添加节点,节点会按其存放的数据大小顺序一层一层地依次排列。同一层的节点从左往右按大小顺序递增,下一层的比上一层的大。
比如:有个树集对象myTree,利用add方法添加节点。
myTree.add("boy"); myTree.add("zoo"); myTree.add("girl"); myTree.add("apple"); 则第一个节点(在第一层)为apple,第二个节点(在第二层)为boy,第三个节点(在第二层)为girl,第四个节点(在第三层)为zoo。由于String类的compareTo对大小相等的两个节点未做处理,所以当再次添加大小相同的节点时,与之前的节点合并。
下面是利用树集和对象数组输出排序后的对象数据。
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.TreeSet;
//利用树集实现一些操作,树集本身以升序方式保存实现了comparable接口的类的对象
class Student implements Comparable{
String name;
int score=0;
Student(String name,int score){
this.name=name;
this.score=score;
}
public int compareTo(Object o){
Student stu = (Student)o;
if(score!=stu.score)
return score-stu.score;
else
return 1;//成绩相等则默认后添加的节点大,没有此句,则TreeSet覆盖成绩相等的数据
}
}
public class Main {
public static void main(String[] args) {
System.out.println("利用树集排序输出对象");
TreeSet<Student> myTree=new TreeSet<Student>();
myTree.add(new Student("钱二",90));
myTree.add(new Student("赵一",66));
myTree.add(new Student("李三",86));
myTree.add(new Student("孙四",66));
Iterator<Student> iter=myTree.iterator();
while(iter.hasNext()){
Student t=iter.next();
System.out.println(t.name+" "+t.score);
}
System.out.println("对象数组排序:");
Student[] stu=new Student[4];
stu[0]=new Student("钱二",90);
stu[1]=new Student("赵一",66);
stu[2]=new Student("李三",86);
stu[3]=new Student("孙四",66);
Arrays.sort(stu);
for(Student i:stu)
System.out.println(i.name+" "+i.score);
}
}
输出:
利用树集排序输出对象
赵一 66
孙四 66
李三 86
钱二 90
对象数组排序:
赵一 66
孙四 66
李三 86
钱二 90
其他方法:1. 用链表保存对象数据,然后用Collections类的静态sort方法对链表排序,用迭代器遍历输出。
2, 也可以用TreeMap替换TreeSet,区别是前者对关键字进行升序,后者对对象进行升序,即前者compareTo的重写交给Key类(保存着成绩数据),后者交给Student类(虽然也保存着成绩数据)。TreeMap的好处是当关键字变了,基于成绩的排序可扩展,即可以按照英语成绩排序也可以按照数学成绩排序。