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
    评论
TreeSet是一个有序的集合,它可以根据元素的自然顺序或者指定的比较器进行排序。在使用TreeSet时,需要实现Comparable接口或者传入一个Comparator对象来指定排序规则。 如果要重写compareTo方法,需要注意以下几点: 1. compareTo方法的返回值应该是一个整数,表示当前对象与另一个对象的大小关系。如果当前对象小于另一个对象,返回负数;如果当前对象等于另一个对象,返回;如果当前对象大于另一个对象,返回正数。 2. compareTo方法应该与equals方法保持一致,即如果两个对象相等,它们的compareTo方法应该返回。 3. compareTo方法应该是可传递的,即如果a.compareTo(b)返回负数,b.compareTo(c)返回负数,那么a.compareTo(c)也应该返回负数。 4. compareTo方法应该是可反转的,即如果a.compareTo(b)返回正数,那么b.compareTo(a)应该返回负数。 下面是一个示例代码,演示如何重写compareTo方法: ``` public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Person o) { if (this.age < o.age) { return -1; } else if (this.age > o.age) { return 1; } else { return this.name.compareTo(o.name); } } } ``` 在这个示例中,我们定义了一个Person,它有两个属性:name和age。我们希望按照年龄从小到大排序,如果年龄相同,则按照姓名的字典序排序。因此,我们在compareTo方法中先比较年龄,如果年龄不同,直接返回年龄的大小关系;如果年龄相同,再比较姓名的字典序。这样,我们就可以使用TreeSet来对Person对象进行排序了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值