TreeSet:是一个有序集合,其元素按照升序排列,默认是按照自然顺序排 列,也就是说TreeSet中的对象元素需要实现Comparable接口。
实现原理:红黑树,比父节点小的放左边,比父节点大的放右边,相同只存储一个,当连续三个元素还没出现分叉时,会自动将中间元素作为节点,这样会减少比较次数,提高排序效率。
TreeSet存储自定义类:当我们使用TreeSet存储自定义类时,需要在自定义类中重写compareTo方法,以提供比对形式,否在TreeSet不能对用户自定义的类型进行正确的树状排序。
实例如下:
首先自定义一个学生类
package com.zzu.java13.treeset;
public class Students implements Comparable{
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 treeset = new TreeSet();
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]