TreeSet以及存储自定义类重写compareTo()

TreeSet:是一个有序集合,其元素按照升序排列,默认是按照自然顺序排 列,也就是说TreeSet中的对象元素需要实现Comparable接口。

实现原理:红黑树,比父节点小的放左边,比父节点大的放右边,相同只存储一个,当连续三个元素还没出现分叉时,会自动将中间元素作为节点,这样会减少比较次数,提高排序效率。

TreeSet存储自定义类:当我们使用TreeSet存储自定义类时,需要在自定义类中重写compareTo方法,以提供比对形式,否在TreeSet不能对用户自定义的类型进行正确的树状排序。

实例如下:
首先自定义一个学生类

package com.zzu.java13.treeset;

public class Students implements Comparable<Students>{

    String stuNo ; 
    String stuName;
    int score;
    public Students(String stuNo, String stuName, int score) {
        super();
        this.stuNo = stuNo;
        this.stuName = stuName;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Students [stuNo=" + stuNo + ", stuName=" + stuName + ", score=" + score + "]";
    }
    public String getStuNo() {
        return stuNo;
    }
    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    @Override
    public int compareTo(Students stu) {
        if(stu!=null){
            if(score == stu.score){
                return stuNo.compareTo(stu.stuNo);
            }
            return score - stu.score;
        }
        return 0;
    }




}

重写的compareTo()如下:

public int compareTo(Students stu) {
        if(stu!=null){
            if(score == stu.score){
                return stuNo.compareTo(stu.stuNo);
            }
            return score - stu.score;
        }
        return 0;
    }

TreeSet 要注意的事项:
TreeSet 要注意的事项:
* 1、往TreeSet添加元素的时候,如果元素具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序村粗;
* 2、往TreeSet添加元素的时候,如果元素不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口, 把元素的比较规则定义在compareTo(T o)方法上。
* 3、比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加(注意:TreeSet和hashCode、equals方法没有任何联系)

public class TreeSetDemo {

    public static void main(String[] args) {
        Set<Students> treeset = new TreeSet<Students>();
        treeset.add(new Students("100","张三",58));
        treeset.add(new Students("101","李四",67));
        treeset.add(new Students("102","王五",93));
        treeset.add(new Students("103","赵六",89));
        treeset.add(new Students("104","韩七",89));
        for(Students stu:treeset){
            System.out.println(stu);
        }
    }

}

输出结果为:
Students [stuNo=102, stuName=王五, score=93]
Students [stuNo=103, stuName=赵六, score=89]
Students [stuNo=104, stuName=韩七, score=89]
Students [stuNo=101, stuName=李四, score=67]
Students [stuNo=100, stuName=张三, score=58]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值