简要区别
自然排序可用在list和set中,当用在list集合中时要通过Collections(list)对排序规则进行调用,谁是最后一个排序的就按照哪个排序规则进行排序
当用在TreeSet集合中时(TreeSet集合就是为了排序存在的),如果没有比较器排序存在,那么就一定要让Student类实现Comparable接口,要不然会报错,如果是按照比较器进行排序,student类就不用实现Comparable接口了
public class TestTreeSet1 {
public static void main(String[] args) {
TreeSet set = new TreeSet();
List<Student> list = new ArrayList<Student>();
Student s = new Student(4, "jack");
Student s2 = new Student(2, "hello");
Student s3 = new Student(1, "bob");
Student s4 = new Student(3, "gm");
/*
* set.add(s); set.add(s2); set.add(s3); set.add(s4);
*/
// 若将student对象添加到list集合中,要调用Collections.sort()方法实现对象排序
list.add(s);
list.add(s2);
list.add(s3);
list.add(s4);
/*
* 什么是自然排序,就是我们要实现排序的对象事先实现Comparable接口,重写compareTo(Object o)方法,对于list集合
* 可以通过Collections.sort(list)按自然之前定好的自然排序规则进行排序,底层原理是Collection.sort(
* list)方法会调用 Comparable接口的实现类的compareTo(Object o)方法进行排序(在list集合中进行排序)
*
*/
Collections.sort(list);
/*
* 也可以通过自己重写一个比较器(匿名内部类),按照比较器的compare(Object o1,Object
* o2)方法的比较规则进行定制排序, collection.sort(list,new
* Comparator()),最后底层会调用到compare(Object o1,Object
* o2方法在list集合中将对象元素进行排序
*
*/
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.id - o2.id;
}
});
for (Student student : list) {
System.out.println(student + ",");
}
// 遍历方法一
/*
* for(Object o:set)
System.out.println(o);
* System.out.println("-----------");
//遍历方法二 Iterator
* iter=set.iterator();
while(iter.hasNext()) {
* System.out.println(iter.next().toString()); }
*/
}
}
/**
* TreeSet集合中添加2个Err对象,添加第一个对象时,TreeSet里没有任何元素,所以没有问题;当添加第二个Err对象时,
* TreeSet就会调用该对象的compareTo(Object obj)方法与集合中其他元素进行比较——如果对应的类
* 没有实现Comparable接口,则会引发ClassCastException异常。而且当试图从TreeSet中取出元素第一个元素时,
* 依然会引发ClassCastException异常。
*
* 关于TreeSet是如何根据Comparable实现类的compareTo(Object
* o)方法的排序规则或比较器Comparator的compare实现排序的:
* TreeSet底层是TreeMap,TreeSet的add()方法添加student对象元素时,会调用TreeMap的put()方法,
* put方法中,如果比较器排序不为空的话,就调用 比较器对象Comparator中的compare(Object o1,Object o2)方法,
* 将元素按照排序规则放置到红黑树的左边或右边
* 如果比较器对象为空,再按照student对象中重写的compareTo(Object o)方法再红黑树上边添加元素边排序(比较器排序优先于自然排序)
*
* @author lenovo
*
*/
class Student implements Comparable {
public int id;
public String name;
public Student(Integer id, String name) {
this.id = id;
this.name = name;
}
public int compareTo(Object o) {
Student s = (Student) o;
if (this.name.length() == s.name.length())
return -(this.name.charAt(0) - s.name.charAt(0));
return -(this.name.length() - s.name.length());
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}