Java使用TreeSet来排序学生成绩

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节日快乐。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值