写在前面:
红黑树:
TreeSet中的对象元素需要实现Comparable接口。
比如这样:Set<Student> stuSet = newTreeSet<Student>();
publicclass Student extends PStu implements Comparable<Student>{}
1、存储整数对象时,自动排序(升序)。如:
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
setTest();
}
public static void setTest(){
Set<Integer> stuSet = new TreeSet<Integer>();
stuSet.add(89);
stuSet.add(69);
stuSet.add(59);
stuSet.add(99);
stuSet.add(99);
stuSet.add(100);
for(Integer stu : stuSet){
System.out.println("--------------->" + stu);
}
}
输出结果:
--------------->59
--------------->69
--------------->89
--------------->99
--------------->100
自动去重。直接继承了SET中的ADD()方法。这里可同HashSet中讲解的一致。
后期对象去重,也参见HashSet讲解。(HashSet去重问题深刻讨论)
根据ASCII码升序排序。
2、需求
我们有一个Student()类。里面有stuNo score。现在让score降序排列。如果相同,stuNo升序。
原始代码如下:
public class Student extends PStu implements Comparable<Student>{
private String stuNo;
private String stuName;
private int gender;
private int score;//妄图利用分数排序
public Student() {
super();
}
public Student(String stuNo, int score) {
super();
this.stuNo = stuNo;
this.score = score;
}
public Student(String stuNo, String stuName, int gender) {
this.stuNo = stuNo;
this.stuName = stuName;
this.gender = gender;
}
/**
* @return the stuNo
*/
public String getStuNo() {
return stuNo;
}
/**
* @param stuNo the stuNo to set
*/
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
/**
* @return the stuName
*/
public String getStuName() {
return stuName;
}
/**
* @param stuName the stuName to set
*/
public void setStuName(String stuName) {
this.stuName = stuName;
}
/**
* @return the gender
*/
public int getGender() {
return gender;
}
/**
* @param gender the gender to set
*/
public void setGender(int gender) {
this.gender = gender;
}
public int hashCode(){
return stuNo.hashCode();
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", gender=" + gender + ", score=" + score + "]";
}
/**
*
*/
public boolean equals(Object o){//重构equals方法
if(o == null){
return false;
}else{
if(this == o){
return true;
}else{
if(o instanceof Student){//判断o是不是student类型
Student stu = (Student) o;//是学生后强转
if(stu.getStuNo().equals(getStuNo())){//此时是学号相等时去重
return true;
}
}
return false;
}
}
}
}
现在来看Comparable接口中的方法compareTo的API说明
compareTo
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
实现类必须确保对于所有的 x和 y都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x))的关系。(这意味着如果 y.compareTo(x)抛出一个异常,则 x.compareTo(y)也要抛出一个异常。)
实现类还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0)意味着 x.compareTo(z)>0。
最后,实现者必须确保 x.compareTo(y)==0意味着对于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 强烈推荐 (x.compareTo(y)==0) == (x.equals(y))这种做法,但并不是 严格要求这样做。一般来说,任何实现 Comparable接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”
在前面的描述中,符号 sgn(expression)指定 signum 数学函数,该函数根据 expression 的值是负数、零还是正数,分别返回 -1、0或 1中的一个值。
参数:
o - 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
String有实现了这个接口。里面的compareTo()代码:
省略,不重要,不要带偏!
所以,我们在Student中实现这个方法,代码如下:
/*此对象o(score)大于指定对象,则返回正整数。所以这就是升序的关键。
*/
@Override//接口中的方法
public int compareTo(Student stu) {//改变TreeSet顺序的方法
if(stu != null){
if(score == stu.score){
return stuNo.compareTo(stu.getStuNo());//此处正常使用String类型的比较,符合规则。所以升序
}
return stu.score - score;//这里score大于指定对象时,返回负整数,刚好相反,所以score降序
}
return 0;
}
结果如下:
----------------->Student [stuNo=2017120503,stuName=null, gender=0, score=94]
----------------->Student [stuNo=2017120502,stuName=null, gender=0, score=89]
----------------->Student [stuNo=2017120504,stuName=null, gender=0, score=85]
----------------->Student [stuNo=2017120505, stuName=null,gender=0, score=85]
----------------->Student [stuNo=2017120501,stuName=null, gender=0, score=59]
功能实现
闲着没事的马克又想让score相等的情况下stuNo降序
我们再改一下:
public int compareTo(Student stu) {//改变TreeSet顺序的方法
if(stu != null){
if(score == stu.score){
return -stuNo.compareTo(stu.getStuNo());//此处返回值倒过来,降序。
}
return stu.score - score;//这里score大于指定对象时,返回负整数,刚好相反,所以score降序
}
return 0;
}
结果如下:
----------------->Student [stuNo=2017120503,stuName=null, gender=0, score=94]
----------------->Student [stuNo=2017120502,stuName=null, gender=0, score=89]
----------------->Student [stuNo=2017120505,stuName=null, gender=0, score=85]
----------------->Student [stuNo=2017120504,stuName=null, gender=0, score=85]
----------------->Student [stuNo=2017120501,stuName=null, gender=0, score=59]
功能实现