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

来源:互联网 发布:linux一键搭建squid 编辑:程序博客网 时间:2024/06/05 00:58

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