需求:用TreeSet集合存储3个学生信息,学生信息包括姓名、年龄、语文成绩、数学成绩、和总分,要求按总分从高到低排序,若总分一样按语文排序,如果语文一样按数学排序,如果数学一样按年龄排序,如果年龄一样按姓名默认排序。
详细代码如下:
Student类(重写toString方法和compareTo方法)
public class Student implements Comparable<Student> {
// 姓名、年龄、语文成绩、数学成绩、和总分
private String name;
private int age;
private double chinese;
private double math;
private double sum;
//构造方法
public Student() {
}
public Student(String name, int age, double chinese, double math, double sum) {
this.name = name;
this.age = age;
this.chinese = chinese;
this.math = math;
this.sum = sum;
}
// set/get
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getChinese() {
return chinese;
}
public void setChinese(double chinese) {
this.chinese = chinese;
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
public double getSum() {
return sum;
}
public void setSum(double sum) {
this.sum = sum;
}
// 重写tostring()和compareTo()
@Override
public String toString() {
return "Student{" +
"姓名='" + name + '\'' +
", 年龄=" + age +
", 语文=" + chinese +
", 数学=" + math +
", 总分=" + sum +
'}';
}
@Override
public int compareTo(Student o) {
/*要求按总分从高到低排序,如果总分一样则按语文成绩从高到低排序,如果语文一样再按数学,如果数学一样,
再按年龄从低到高排序,如果年龄一样再按姓名排序*/
double sum=o.sum-this.sum;//大于0,新元素存右边,小于0存左边,总分从高到低规则
double result=sum==0?(o.chinese-this.chinese):sum;//判断总分是否相等,总分相等则rusult=o.chinese-this.chinese按语文排,不相等则rusult=o.sum-this.sum,按总分排
result=result==0?(o.math-this.math):result;//总分相等后,按语文排,再判断语文是否相等,语文相等则rusult=o.math-this.math按数学排,语文不相等则按语文排
result=result==0?(this.age-o.age):result;//总分相等,语文相等,按数学排,再判断数学是否相等,数学相等则rusult=this.age-o.age按年龄排,数学不相等则按数学排
result=result==0?(this.name.compareTo(o.name)):result;//总分相等,语文相等,数学相等,按年龄排,再判断年龄是否相等,年龄相等则this.name.compareTo(o.name)按默认姓名排,年龄不相等则按年龄排
return (int) result;
}
}
测试类:
public class TreeSetTest {
public static void main(String[] args) {
// 需求:用treeset集合存储3个学生信息,学生信息包括姓名、年龄、语文成绩、数学成绩、
// 和总分,要求按总分从高到低排序,如果总分一样则按语文成绩从高到低排序,如果语文
// 一样再按数学,如果数学一样,再按年龄从低到高排序,如果年龄一样再按姓名排序
// 1.手动录入3个学生信息,创建学生对象,并存储进TreeSet集合
// 创建集合
Scanner sc=new Scanner(System.in);
TreeSet ts=new TreeSet();//使用自定义类方式进行排序
for(int i=0;i<3;i++)
{
System.out.println("输入学生姓名");
String name=sc.next();
System.out.println("输入学生年龄");
int age=sc.nextInt();
System.out.println("输入学生语文成绩");
double chinese=sc.nextDouble();
System.out.println("输入学生数学成绩");
double math=sc.nextDouble();
double sum=math+chinese;
Student s1=new Student(name,age,chinese,math,sum);
ts.add(s1);
}
// 输出
System.out.println(ts);
}
}