首先根据思路编写代码,然后根据要求分析排序的主要条件和次要条件(分析思路在文末),在学生类中有三个成员变量,姓名(name),语文成绩(chinese),数学成绩(math),要求按照总分排序,在本需求中仅需要两科成绩,如果需要多门成绩时多次调用get方法就比较麻烦,可以在学生类中提供一个公开的获取总分的方法,getSum:
//提供获取总分的方法 public int getSum() { int sum = this.chinese + this.math; }
操作类代码实现:
public class TreeSetDemo { public static void main(String[] args) { //创建集合对象 TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { //主要条件:按照总分由高到低 int num = s2.getSum() - s1.getSum(); return num; } }); //创建学生对象 Student s1 = new Student("托马斯",99,98); Student s2 = new Student("旭旭宝宝",100,99); Student s3 = new Student("大坤坤",95,97); Student s4 = new Student("王欣",97,98); Student s5 = new Student("高的伟",98,97); //添加元素到集合 treeSet.add(s1); treeSet.add(s2); treeSet.add(s3); treeSet.add(s4); treeSet.add(s5); //遍历集合 for (Student s : treeSet){ System.out.println(s.getName()+","+s.getChinese()+","+s.getMath()+","+s.getSum()); } } }
输出结果:
通过运行结果可以发现,学生对象s5并没有添加进去,原因在于:s4和s5的总分相同,排序器认为二者是相同的元素,所以没有被添加,显然这是不完善的代码,排序条件不够完善。
接下来分析排序条件:
1.在总分不同时,按总分降序排序
2.在总分相同时,比较单科成绩,按单科成绩自然排序 此时排序条件为:int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
3.当总分相同,各单科成绩也相同时,比较名字是否相同,名字不同时按自然顺序排序 此时排序条件为 int num3 = num2 == 0 ? s1.getName().compareTo(s2.getName()) : num2;
根据分析完善代码:
TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { //主要条件:按照总分由高到低 int num = s2.getSum() - s1.getSum(); int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num; int num3 = num2 == 0 ? s1.getName().compareTo(s2.getName()) : num2; return num3; } });
运行结果:
原文:https://www.cnblogs.com/pxy-1999/p/12665767.html