想要使用TreeSet存储自定义类型,需要制定排序规则,具体实现如下。
方法一
让自定义的类(如学生类)实现Comparable接口重写里面的compareTo方法来定制比较规则。
Test.java
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set<Student> st=new TreeSet<>();
st.add(new Student("Li Ming",98));
st.add(new Student("Zhang San",76));
st.add(new Student("Wang Gang",88));
st.add(new Student("Xiao Zhang",98));
System.out.println(st.toString());
}
}
Studen.java
public class Student implements Comparable<Student>{ //这里要实现Comparable接口
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return this.name+" -> "+this.score;
}
//重写比较规则
@Override
public int compareTo(Student o) {
// return o.score-this.score; //这样写的话虽然是按成绩降序,但是若有成绩相同但姓名不同的,将返回0,认为这是同一个对象被去重
return o.score-this.score>=0 ? 1:-1; //只返回1、-1 ,也可以进一步写规则,当成绩相同时按名字、学号排序
}
}
方法二
TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。
Test.java
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set<Student> st=new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//方法二:集合自带比较器对象
//当同时在Student中定义了比较规则时,优先使用定义集合时的规则
return o1.getScore()-o2.getScore()>=1? 1:-1; //这里是按成绩升序,Student是按成绩降序,可以观察一下
}
});
st.add(new Student("Li Ming",98));
st.add(new Student("Zhang San",76));
st.add(new Student("Wang Gang",88));
st.add(new Student("Xiao Zhang",98));
System.out.println(st.toString());
}
}
Studen.java
public class Student implements Comparable<Student>{ //这里要实现Comparable接口
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return this.name+" -> "+this.score;
}
//重写比较规则
@Override
public int compareTo(Student o) {
// return o.score-this.score; //这样写的话虽然是按成绩降序,但是若有成绩相同但姓名不同的,将返回0,认为这是同一个对象被去重
return o.score-this.score>=0 ? 1:-1; //只返回1、-1 ,也可以进一步写规则,当成绩相同时按名字、学号排序
}
}
版权声明:本文为weixin_52341477原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。