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

 ——- 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方法,这种方式叫自然排序!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值