zoukankan      html  css  js  c++  java
  • 通过实现Comparable接口结合TreeSet来对对象自动排序

    经过会遇到这样的情况,对于某个对象数组或者链表要按照一定的规则进行排序,那么我们该怎么做呢?
    如遇到这样的需求:
    1.需求1
    对于学生对象按照年龄进行排序,年龄小的排在前面。
    单单看到这样的需求,实现起来是比较简单的,自己写个函数实现一下快速排序或者比较土的冒泡排序,按照年龄来排序就可以了。我们再看看下面的需求
    2.需求2
    对于学生对象,按照年龄进行排序,年龄小的排在前面,年龄相同的,身高小的排在前面。
    3.需求3
    对于学生对象,按照年龄进行排序,年龄小的排在前面;年龄相同的,身高小的排在前面;身高相同时,体重轻的排在前面。
    。。。


    这样的需求,可能会随着页面的复杂化,越来越来复杂,如果要自己去做的话,估计得多层嵌套了,逻辑非常复杂,那是否有现成的比较简单的机制呢。

    答案就是实现Comparable接口。

    具体样例如下:

    public class Student implements Comparable{ 
        private int age; 
         
        public Student(int age) 
        { 
            this.age = age; 
        } 
        @Override 
        public int compareTo(Object obj) { 
            Student stu = (Student)obj; 
            if(this.age>stu.age) 
                return 1; 
            else if(this.age<stu.age) 
                return -1; 
            else 
                return 0; 
        } 
        public int getAge() { 
            return age; 
        } 
        public void setAge(int age) { 
            this.age = age; 
        } 
     

    调用代码:

    public static void main(String[] args) { 
        TreeSet<Student> treeSet = new TreeSet<Student>(); 
        treeSet.add(new Student(1)); 
        treeSet.add(new Student(3)); 
        treeSet.add(new Student(2)); 
        for(Student student:treeSet) 
        { 
            System.out.println(student.getAge()); 
        } 

    输出结果:
    1
    2
    3

    可见自动按照年龄进行了排序,我们再修改一下代码,让学生按照年龄由大到排列:

    public int compareTo(Object obj) { 
        Student stu = (Student)obj; 
        if(this.age>stu.age) 
            return -1; 
        else if(this.age<stu.age) 
            return 1; 
        else 
            return 0; 

    输出结果:
    3
    2
    1

    由此可见,这种通过对象实现Comparable接口,结合TreeSet的方式来进行对象排序,还是十分方便的,而且逻辑比较简单,后续如果有变更,直接修改compareTo方法即可。

  • 相关阅读:
    使用 BenchmarkDotnet 测试代码性能
    【UWP】对 Thickness 类型属性进行动画
    【Win10】单元测试中捕获异步方法的指定异常
    【Win10】让 TextBlock 按字符换行
    全国天气预报信息数据 API 功能简介与代码调用实战视频
    5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用
    获取任意链接文章正文 API 功能简介
    开放数据接口 API 简介与使用场景、调用方法
    程序员如何开始做一个自己的 Side Project?
    VSCode 必装的 10 个高效开发插件
  • 原文地址:https://www.cnblogs.com/jerry1999/p/3677314.html
Copyright © 2011-2022 走看看