1,什么叫自然排序
Comparable接口,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序
只有一个方法 int compareTo(T t)
该方法的返回值,有三种可能
负整数:小于指定对象
零:等于制定对象
正整数:大于制定对象
2,注意,一般情况下,不要add()null值,null其实是可以存放的,但是要避免出现空指针异常,这个问题是很容易出现的。如果不实现Comparator接口,那一定会报空指针异常,如果实现了Comparator接口,通过适当的写法,可以避免出现空指针异常,并且顺利将元素存入和取出
3,实例:
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args){
//第一步:创建集合对象
TreeSet test =new TreeSet();
//第二步:创建集合元素
Integer i1=3;
Integer i2=2;
Integer i3=7;
Integer i4=5;
Integer i5=9;
Integer i6=4;
Integer i7=5;//重复值
Integer i8=null;
//第三步:向集合中添加元素
test.add(i1);
test.add(i2);
test.add(i3);
test.add(i4);
test.add(i5);
test.add(i6);
test.add(i7);
// test.add(i8);
/*
* 为啥存入null值会出错呢?
* null其实是可以存放的,但是要避免出现空指针异常,这个问题是很容易
* 出现的。如果不实现Comparator接口,那一定回报空指针异常,如果实现了
* Comparator接口,通过适当的写法,可以避免出现空指针异常,并且顺利将元素存入和取出
* */
//第四步,遍历集合
for(Integer item:test){
System.out.print(item);
System.out.print(",");
}
System.out.println("=自定义类型Student=======");
TreeSet test1=new TreeSet();
StudentDemo2 stu1=new StudentDemo2(“jerry”,20);
StudentDemo2 stu2=new StudentDemo2(“susan”,19);
StudentDemo2 stu3=new StudentDemo2(“peter”,18);
StudentDemo2 stu4=new StudentDemo2(“jerry”,18);
test1.add(stu1);
test1.add(stu2);
test1.add(stu3);
test1.add(stu4);
for(StudentDemo2 stu:test1){
System.out.println(“集合元素:”+stu);
}
}
}
+++++++++++++++++++++++++++++++
public class StudentDemo2 implements Comparable{
private String name;
private int age;
public StudentDemo2() {
super();
}
public StudentDemo2(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "StudentDemo2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof StudentDemo2)) return false;
StudentDemo2 that = (StudentDemo2) o;
if (getAge() != that.getAge()) return false;
return getName().equals(that.getName());
}
@Override
public int hashCode() {
int result = getName().hashCode();
result = 31 * result + getAge();
return result;
}
/**
* 只有实现了该方法,才能让Student的所有对象具有自然排序的属性
*/
@Override
public int compareTo(StudentDemo2 o) {
/*
* 两个对象谁大谁小自己定
* 例如:下面是一种方案:
* 只比较学生类的对象的年龄
* 对象的年龄大了,我们就认为该对象
* 另一种fangan如果比较两个对象的大小常见的方案逐个比较成员变量
* 如果成员变量相等了,才需要进一步比较第二个成员变量
* */
//从小到大
// return this.age<o.age?-1:(this.ageo.age?0:1);
//从大到小
// return this.age<o.age?1:(this.ageo.age?0:-1);
int num=this.name.compareTo(o.name);
//如果名字已经比较出大小,就不需要再进一步的比较年龄了.
//否则名字相等的情况下,才需要进一步比较年龄
//从大到小
return num!=0?num:(this.age<o.age?1:(this.age==o.age?0:-1));
}
}