Java—TreeSet
TreeSet是一个有序的集合,它的作用是提供有序的Set集合,在java中使用。 下面我们来进行一个实例来操作一下,具体看看怎么使用。
我们的要求是用TreeSet集合存储多个学生对象的姓名,语文和数学成绩,然后按照总分高低输出,如果总分一样,那么就按照语文成绩高低输出,如果都一样就按照姓名的字典顺序输出。要过滤掉相同的学生。
知道了我们的要求,我们就开始构思怎么做了。
1.定义学生类student和集合TreeSet集合对象,然后使用Comparator比较排序器来排序。
2.从键盘输入学生的姓名,俩科成绩。
3.将输入的信息添加到集合对象中去。
4.增强for循环输出。
//student类,这里和前面几篇一样,定义后,然后使用alt + insert来添加方法就可以了。
package new10;
import java.util.Objects;
//Alt Insert生成
public class student {
private String name;
private int chinese;
private int math;
public student() {
}
public student(String name, int chinese, int math) {
this.name = name;
this.chinese = chinese;
this.math = math;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getsum(){//这里是方便排序的时候使用,计算总分。
return this.getMath()+this.getMath();
}
}
//主函数
package new10;
import javax.swing.tree.TreeCellEditor;
import java.util.*;
/* 学生总成绩排序,总分相同就按照姓名来排*/
public class hello {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//创建集合对象
TreeSet<student> ts=new TreeSet<student>(new Comparator<student>() {
@Override //重写比较器排序函数
public int compare(student s1, student s2) {
int num= (s2.getsum())-(s1.getsum());//总分按照高低排序
int num2= num==0?s2.getChinese()-s1.getChinese():num;//总分一样,按照语文成绩高低排序
int num3= num2==0?s2.getName().compareTo(s1.getName()):num2;//都一样按照姓名字典排序
return num3;
//return 0;
}
});
// //创建学生对象 有参方法自己加入姓名和成绩
// student s1=new student("张三",80,90);
// student s2=new student("李四",70,89);
// student s3=new student("王五",65,78);
// student s4=new student("阿毛",67,89);
// student s5=new student("李理",67,89);
// //将学生对象加入到集合中去
// ts.add(s1);
// ts.add(s2);
// ts.add(s3);
// ts.add(s4);
// ts.add(s5);
for(int i=0;i<4;i++){//自己键盘输入。
System.out.print("请输入学生姓名");
String name1=sc.next();
System.out.print("请输入学生语文成绩");
int chinese1=sc.nextInt();
System.out.print("请输入学生数学成绩");
int math1=sc.nextInt();
student s=new student();
s.setName(name1);
s.setChinese(chinese1);
s.setMath(math1);
ts.add(s);
}
for(student s:ts){//重写comparable,0是一样的,1是按照给的顺序写,-1是倒着来
System.out.println(s.getName()+","+s.getChinese()+","+s.getMath()+","+s.getsum());
}
}
}
在这里我们要注意一点就是,当 我们输入的成绩总分计算一样的时候,我们要排序,不然那个原本的比较器排序就会,认为是同一个人,所以我们要重写那个方法,还有一点就是都一样,那么他也会认为是相同的,所以我们要添加一个对比姓名是否一样的表达式,这样就没有问题了。下面就是这一块的代码。
TreeSet<student> ts=new TreeSet<student>(new Comparator<student>() {
@Override //重写比较器排序函数
public int compare(student s1, student s2) {
int num= (s2.getsum())-(s1.getsum());//总分按照高低排序
int num2= num==0?s2.getChinese()-s1.getChinese():num;//总分一样,按照语文成绩高低排序
int num3= num2==0?s2.getName().compareTo(s1.getName()):num2;//都一样按照姓名字典排序
return num3;
//return 0;
}
});
下面是程序运行的结果
在这里就可以看见,第二三四名,是按照我们写的那个函数输出的。
最后记住一点,如果要使用TreeSet的话,一定要自己重新写那个Comparable比较器函数(return默认是0),不然他会只录入一行,但是把return 的结果改为1的话,就是按照你录入的顺序输出的,return是-1就是倒序输出。例子如下面。
//student类
public class student implements Comparable{
@Override
public int compareTo(Object o) {
return 0;//只会录入一行
return 1;//按照给的顺序输出
return -1;//按照给的顺序倒序输出
}
}
//主函数,定义集合对象
TreeSet<student> ts=new TreeSet<student>();
OK,本文结束,如有错误请指正.
最后祝大家1024节日快乐。