TreeSet的排列顺序与重写的compareTo()方法的返回值有关。
return 0:元素每次进行比较,都认为是相同的元素,这是就不再向TreeSet里面插入除第一个元素以外的元素,所以TreeSet中就只插入了一个元素。
return 1:元素每次进行比较,都认为新插入的元素比上一个元素大,于是二叉树存储时,会储存在根的右侧,读取时就是正序排列,先进先出。
return -1:元素每次进行比较,都认为新插入的元素比上一个元素小,于是二叉树存储时,会储存在根的左侧,读取时就是倒序排列,先进后出。
封装类
package com.hope;
public class Student{//学生类
private String name;//学生姓名
private Integer chineseScores;//语文成绩
private Integer mathScores;//数学成绩
private Integer englishResults;//英语成绩
private Integer sum;//总分
public Student(String name, Integer chineseScores, Integer mathScores, Integer englishResults, Integer sum) {
this.name = name;
this.chineseScores = chineseScores;
this.mathScores = mathScores;
this.englishResults = englishResults;
this.sum = sum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getChineseScores() {
return chineseScores;
}
public void setChineseScores(Integer chineseScores) {
this.chineseScores = chineseScores;
}
public Integer getMathScores() {
return mathScores;
}
public void setMathScores(Integer mathScores) {
this.mathScores = mathScores;
}
public Integer getEnglishResults() {
return englishResults;
}
public void setEnglishResults(Integer englishResults) {
this.englishResults = englishResults;
}
public Integer getSum() {
return sum;
}
public void setSum(Integer sum) {
this.sum = sum;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", chineseScores=" + chineseScores +
", mathScores=" + mathScores +
", englishResults=" + englishResults +
", sum=" + sum +
'}';
}
}
测试类
package com.hope;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class TestStudent {
public static void main(String[] args) {
/**
* 键盘录入3个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出
* 分析:
* ① 创建学生类(姓名,语文成绩,数学成绩,英语成绩,总分)
* ② 创建TreeSet集合,用来存储学生对象
* ③ 录入学生信息
* ④ 创建学生对象的比较器
* ⑤ 把学生对象添加到TreeSet集合中
* ⑥ 遍历集合
*/
System.out.println("键盘录入3个学生信息(姓名,语文成绩,数学成绩,英语成绩)");
//TreeSet集合创建对象比较器
Set<Student> set=new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
/**
* TreeSet的排列顺序与重写的compareTo()方法的返回值有关。
*
* return 0:元素每次进行比较,都认为是相同的元素,这是就不再向TreeSet里面插入除第一个元素以外的元素,所以TreeSet中就只插入了一个元素。
*
* return 1:元素每次进行比较,都认为新插入的元素比上一个元素大,于是二叉树存储时,会储存在根的右侧,读取时就是正序排列,先进先出。
*
* return -1:元素每次进行比较,都认为新插入的元素比上一个元素小,于是二叉树存储时,会储存在根的左侧,读取时就是倒序排列,先进后出。
*/
// 按照总分从高到低输出 不相同最后的返回结果还是sum 100-50
int sum=s2.getSum()-s1.getSum();
//总分成绩相同比较语文成绩
int sum1=sum==0?s1.getChineseScores()-s2.getChineseScores():sum;
//总分相同比较数学成绩+语文成绩
int sum2=sum1==0?s1.getMathScores()-s2.getMathScores():sum1;
//总分相同比较英语成绩+数学成绩+语文成绩
int sum3=sum2==0?s1.getEnglishResults()-s2.getEnglishResults():sum2;
//总分相同比较英语成绩+数学成绩+语文成绩+姓名
int sum4=sum3==0?s1.getName().compareTo(s2.getName()):sum3;
return sum4;
}
});
Scanner sc=new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请输入学生姓名:");
String name=sc.next();
System.out.println("请输入学生的语文成绩:");
Integer chineseScores=sc.nextInt();
System.out.println("请输入学生的数学成绩:");
Integer mathScores=sc.nextInt();
System.out.println("请输入学生的英语成绩:");
Integer englishResults=sc.nextInt();
Integer sum=chineseScores+mathScores+englishResults;
Student student = new Student(name, chineseScores, mathScores, englishResults,sum);
set.add(student);
}
//便利set
for (Student s : set) {
System.out.println(s.getName() + "\t" + s.getChineseScores() + "\t"
+ s.getMathScores() + "\t" + s.getEnglishResults()+"\t"+s.getSum());
}
}
}