——- android培训、java培训、期待与您交流! ———-
/*
只根据年龄判断去重,这个太不符合实际了,
把需求改一下:
往TreeSet集合中存储自定义对象学生。
想先按照学生的年龄进行排序,
如果年龄相同则判断姓名,根据字符串排序。
那么只需要在年龄相等的时候在判断一次就可以解决问题了!
import java.util.*;
//学生类实现Comparable接口,并覆盖comparTo()方法---让Student自身具备可比性
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)
{
//强制类型转换为Student
Student s = (Student)obj;
//return 0;
//利用Integer中的compareTo方法进行比较学生年龄
int num = new Integer(this.getAge()).compareTo(new Integer(s.getAge()));
//当年龄相等的时候对姓名进行判断
if(num == 0)
return this.getName().compareTo(s.getName());
//返回两对象年龄比较结果
return num;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
//主类
class TreeSetDemo
{
public static void main(String[] args)
{
//1 创建TreeSet集合
TreeSet ts = new TreeSet();
//2 添加学生对象
ts.add(new Student("Jack",20));
ts.add(new Student("Jane",21));
ts.add(new Student("Jane",21));
ts.add(new Student("Jimmy",20));
ts.add(new Student("Jone",15));
ts.add(new Student("Jone",15));
ts.add(new Student("Tom",26));
ts.add(new Student("Jordan",16));
//迭代取出
for(Iterator it = ts.iterator(); it.hasNext(); )
{
//强制转换为Student对象
Student stu = (Student)it.next();
System.out.println(stu.getName()+"----"+stu.getAge());
}
}
}
运行结果为:
Jone—-15
Jordan—-16
Jack—-20
Jimmy—-20
Jane—-21
Tom—-26
现在符合实际情况了,年龄相同但姓名不同的人已经成功存入了!
而且在年龄相等的情况下,对年龄也进行了自然排序。
现在先做个小结:
在TreeSet集合中去除重复元素的时候,
当主要条件相同时,一定要对次要条件进行判断。
例如,在本例中,主要条件为年龄,次要条件为姓名。
当且仅当主要条件和次要条件均相同的时候,不存入。
例如,在本例中姓名和年龄均相同的时候,不存入。
TreeSet集合的底层数据结构是什么呢?
答案是:二叉树。
那么如果我们想要保持存取顺序一致该怎么做呢??
很简单,只需要在覆盖compareTo方法的时候,令返回值为固定值1,即:
return 1;
这是什么意思呢?
这是表示this对象比obj对象大,对应的二叉树结构就会是这样的:
运行结果:
Jack—-20
Jane—-21
Jane—-21
Jimmy—-20
Jone—-15
Jone—-15
Tom—-26
Jordan—-16
如果是倒序取出呢?
很简单,只需要在覆盖compareTo方法的时候,令返回值为固定值-1,即:
return -1;
这是表示this对象比obj对象小,对应的二叉树结构就会是这样的:
运行结果:
Jordan—-16
Tom—-26
Jone—-15
Jone—-15
Jimmy—-20
Jane—-21
Jane—-21
Jack—-20
当return 0;时表示只所有元素都相等,那么就只能存入一个元素了,自然也只能取出一个元素。
运行结果:
Jack—-20
所以,再汇总一下所学知识:
TreeSet保证元素唯一性的依据是:
compareTo方法return 0;
TreeSet第一种排序方式:
让元素自身具备可比性,
元素需要实现Comparable接口,覆盖compareTo方法,这种方式叫自然排序!