您的位置:首页 > 职场人生

黑马程序员_日记44_TreeSet第一种排序方式小结

2015-04-15 16:44 253 查看
 ——- 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方法,这种方式叫自然排序!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  treeset 集合