Java学习——集合的使用(五)

目录

Comparable

Comparator比较器

 

Comparable

此接口对实现它的每个类的对象强加一个总排序。 这种排序被称为类的自然顺序 ,类的compareto方法被称为其自然比较方法

  • 自然排序Compareable的使用

    • 用TreeSet集合存储自定义的对象,无参构造方法使用的是自然排序对元素进行排序的。

    • 自然排序,就是让元素所属的类实现Compareable接口,重写compareTo(T o)方法

    • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。

  • 案例:存储学生对象并遍历,创建TreeSet集合使用无参构造方法,按年龄大小排序,年龄相同时看名字是否相同,不相同的话按照姓名字母的顺序进行排序,否则剔除该元素。

  • 这里出现了异常,意思是类StudentA不能转换为Compareable类型的类,这时,就需要让StudentA实现Compareable接口,并重写compareTo方法。

  • 在这里需要对return的返回值进行处理,使得满足要求

    这里的处理,将本对象与上一个对象进行比较结果赋值给num,并且若num==0?,也就是两个人的年龄是否相同,相同的话去比较名字,否则将num赋值给num1最后将num1返回。

  • 最后的测试,名字不同,年龄相同的人。名字,年龄都相同的人。

Comparator比较器

比较函数,它对某些对象集合施加总排序 。 可以将比较器传递给排序方法(例如Collections.sort或Arrays.sort),以便精确控制排序顺序。

  • 比较器Comparator的使用

    • 用TreeSet集合存储自定义的对象,带参构造方法使用的是比较器排序的方法对元素进行排序的

    • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写Compare(T o1,T o2)方法

    • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

  • 在这里直接使用TreeSet的带参构造器,其中在参数中定义匿名内部类Comparator<StudentA>,并重写了Comparator接口的Compare方法,其中的两个参数就是在Comparable自然排序中使用的this.age-s.age。在这里通过get方法调用属性,其余不变。依然能得到我们想要的结果。

  • 在这里要求输入一个学生的成绩包括语文成绩,数学成绩,并对总成绩进行排序。

            TreeSet<StudentA> stu = new TreeSet<>(new Comparator<StudentA>() {//匿名内部类
                @Override
                public int compare(StudentA s1, StudentA s2) {
                    int num=s2.getSum()-s1.getSum();//总分的比较
                    int num2=num==0?s2.getChineseScore()-s1.getChineseScore():num;//两科成绩是否相同的比较
                    int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;//名字是否相同的比较
                    return num3;
                }
            });
            StudentA s1 = new StudentA("张三",90,89);
            StudentA s2 = new StudentA("李四",99,95);
            StudentA s3 = new StudentA("王五",90,97);
            StudentA s4 = new StudentA("小明",99,98);
    //        名字不同分数相同也能写入TreeSet中
            StudentA s5 = new StudentA("小五",99,98);
            stu.add(s1);
            stu.add(s2);
            stu.add(s3);
            stu.add(s4);
            stu.add(s5);
            for (StudentA studentA : stu) {
                System.out.println(studentA.getName()+" 语文:"+studentA.getChineseScore()+" 数学:"+studentA.getMath()+" 总分:"+studentA.getSum());
            }
    • 结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Iron_Sp-man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值