/*
Set:无序,不可以重复元素。
|--HashSet:数据结构是哈希表。线程不同步。
保证元素唯一性原理:判断元素的hashCode值是否相同。
如果相同,还会继续判断元素的equals方法,是否为true.
|--TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法return 0;
1.TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
这种方式也称为元素的自然顺序,或者叫做默认顺序。
2.TreeSet排序的第二种方式:让集合自身具备比较性。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时,就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。
记住:排序时,当主要条件相同时,一定要判断一下次要条件。
*/
//TreeSet排序的第一种方式:让元素自身具备比较性
import java.util.*;
class Print
{
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Student implements Comparable//该接口强制让学生具备比较性
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
//--------------------------
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
Print.sop(this.name+"...compareTo..."+s.name);
if(this.age>s.age)
return 1;
else if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
}
/*
public int compareTo(Object obj)
{
return 1;//返回值为1,根据二叉树原理,会按存入的顺序取出
}
*/
/*
public int compareTo(Object obj)
{
return -1;//返回值为-1,根据二叉树原理,会按存入相反的顺序取出
}
*/
/*
public int compareTo(Object obj)
{
return 0;//返回值为0,根据二叉树原理,只能存入第一个对象。
//后面的对象都视为和第一个对象是同一个对象,保证了唯一性
}
*/
//---------------------------
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class TreeSetDemo1
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lisi05",15));
ts.add(new Student("lisi03",13));
ts.add(new Student("lisi08",18));
ts.add(new Student("lisi09",13));
Iterator it = ts.iterator();
while(it.hasNext())
{
Object obj = it.next();
Student s = (Student)obj;
Print.sop(s.getName()+"..."+s.getAge());
}
}
}
/*
E:\javademo\day15>java TreeSetDemo1
lisi05...compareTo...lisi05
lisi03...compareTo...lisi05
lisi08...compareTo...lisi05
lisi09...compareTo...lisi05
lisi09...compareTo...lisi03
lisi03...13
lisi09...13
lisi05...15
lisi08...18
*/