TreeSet学习的个人记录

来源:互联网 发布:tensorflow 显卡要求 编辑:程序博客网 时间:2024/05/16 12:17

TreeSet是set接口下的一个实现类。1.添加到set中必须是同一个类。2.可以自动从小到大进行排序。

例:

自然排序自定义对象,要求类对象先实现Comparable接口,并重写comparTo()方法

对象类:

public class Person implements Comparable{

private String name;
private Integer age;
public Person() {
super();

}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
Person per=(Person)o;
if(o instanceof Person){
int i=this.age.compareTo(per.age);//先按年龄从小到大排序
if(i==0){
return this.name.compareTo(per.name);//如果年龄相同,就按姓名属性来排序
}else{//如果还有属性比较,再判断就是
return i;
}
}

return 0;
}

}
测试方法

public void test2(){
TreeSet st= new TreeSet();
st.add(new Person("CC",30));
st.add(new Person("AA",29));
st.add(new Person("JJ",26));
st.add(new Person("ZZ",23));
st.add(new Person("BB",23));
System.out.println(st);
}

结果:[Person [name=BB, age=23], Person [name=ZZ, age=23], Person [name=JJ, age=26], Person [name=AA, age=29], Person [name=CC, age=30]]


定制排序

这个要在先创建一个compator接口实现类对象,并重写compare方法。

对象类

package exercise;

public class Student {

private String name;
private Integer age;
public Student() {
super();
}
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}


}
测试方法:

public void test3(){
//1.创建一个实现comparator接口类对象
Comparator com=new Comparator() {
@Override
public int compare(Object o1, Object o2) {
// 向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer
// 的哪个属性排序的。
if(o1 instanceof Student && o2 instanceof Student){
Student stu1=(Student)o1;
Student stu2=(Student)o2;
int i=stu1.getAge().compareTo(stu2.getAge());
if(i==0){
return stu1.getName().compareTo(stu2.getName());
}else{
return i;
}
}
return 0;
}

};
//2建立一个TreeSet集合,并把对象当形参,调用构造器。
TreeSet st=new TreeSet(com);
// 3.向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象。
st.add(new Student("小花",23));
st.add(new Student("神秀",99));
st.add(new Student("楚风",2000));
st.add(new Student("介之",22));
st.add(new Student("润之",22));
for(Object s:st){
System.out.println(s);
}
}

结果:

Student [name=介之, age=22]
Student [name=润之, age=22]
Student [name=小花, age=23]
Student [name=神秀, age=99]
Student [name=楚风, age=2000]


比较,如果自定义对象类可修改就用自然排序,不可修改就用定向排序。