• java中如何对对象排序?


    大家好,我是雄雄。

    前言:

    我们知道,在平时做项目的过程中,我们总会用到各种各样的排序,或是升序,或是降序。在java中,要实现排序有好多中方式,比如我们耳熟能详的冒泡排序、选择排序等,但是我们一般都不用写,JDK给我们提供了好多现成方法供我们使用,今天我们就来看看,java中如何使用Comparator进行排序。

    1

    实现Comparable进行排序

    下面我们来看一个简单的例子:

    package org.test;
    
    /**
     * 
    * 
    * 项目名称:BianChengXiGuan 
    * 类名称:Student 
    * 类描述:学生类
    * 创建人:Mu Xiongxiong 
    * 创建时间:2020-10-19 上午8:47:01 
    * 修改人:Mu Xiongxiong 
    * 修改时间:2020-10-19 上午8:47:01 
    * 修改备注:
    * 个人博客:https://blog.csdn.net/qq_34137397
    * 微信公众号:雄雄的小课堂
    * @version    
    *
     */
    public class Student implements Comparable<Student>{
      /**
       * 学生编号
       */
      private int sid;
      
      /**
       * 学生姓名
       */
      private String name;
      
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      public int getSid() {
        return sid;
      }
      public void setSid(int sid) {
        this.sid = sid;
      }
      /**
       * 
           * 构造函数 
           * @discription 
           * @author Mu Xiongxiong 
           * @created 2020-10-19 上午8:47:43 
           * @param sid
           * @param name 
         * 个人博客:https://blog.csdn.net/qq_34137397
         * 微信公众号:雄雄的小课堂
       */
      public Student(int sid, String name) {
        super();
        this.sid = sid;
        this.name = name;
      }
      /**
       * 
           * 构造函数 
           * @discription 
           * @author Mu Xiongxiong 
           * @created 2020-10-19 上午8:47:48 
         * 个人博客:https://blog.csdn.net/qq_34137397
         * 微信公众号:雄雄的小课堂
       */
      public Student() {
        super();
      }
      
      //接口中必须要实现的方法
      //按照sid进行排序
      //如果传过来的sid比本身的sid小的话,返回1,升序
      //如果传过来的sid比本身的sid大的话,返回-1,降序
      @Override
      public int compareTo(Student o) {
        if(sid>o.sid){
          return 1;
        }else if(sid==o.sid){
          return 0;
        }else{
          return -1;
        }
      }
    
    }

    这是一个很简单的Student实体类,其中对字段的封装,以及构造方法就不在这里说明了。重点看compareTo方法,此方法是Comparable接口中的方法,我们实现了Comparable接口之后必须要实现该方法。要实现升序和降序,肯定少不了比较,那么compareTo方法的作用就在此,用来比较的!

    代码中,compareTo方法中实现的是按照sid进行排序,如果传过来的sid比本身的sid小的话,返回1,升序。如果传过来的sid比本身的sid大的话,返回-1,降序。然后我们写个测试方法进行测试:

    //对集合进行排序
      public static void testSortList(){
        List<Student> stus = new ArrayList<Student>();
        stus.add(new Student(1,"a"));
        stus.add(new Student(4,"d"));
        stus.add(new Student(5,"e"));
        stus.add(new Student(2,"b"));
        stus.add(new Student(3,"c"));
        System.out.println("排序之前:");
        for (Student s : stus) {
          System.out.println(s.getSid()+"---"+s.getName());
        }
        Collections.sort(stus);
        //Collections.sort(stus,new SortName());
        System.out.println("排序之后:\n");
        for (Student s : stus) {
          System.out.println(s.getSid()+"---"+s.getName());
        }
      }

    运行结果如下:

    这是升序,如果想要降序排序,简单的改一下compareTo方法的比较符号即可。按照sid进行排序,比较简单,那假如现在有这样的需求:按照姓名(字符)顺序降序排序,我们应该怎么实现?

    2

    实现Comparator进行排序

    我们看Collections.sort方法,他还有一个重载方法Collections.sort(Listlists,Comparator c);可以接受一个Comparator实现类,我们就可以利用这一点,实现对name进行排序,代码如下:

    package org.test;
    
    import java.util.Comparator;
    
    public class SortName implements Comparator<Student> {
    
      @Override
      public int compare(Student o,Student o1) {
        return o1.getName().compareTo(o.getName());
      }
    
      
    }

    接着稍微改一下Collections.sort方法,如下:

    Collections.sort(stus,new SortName());

    运行结果:

    到此,排序完成,最后大家在思考一下,如果name的值为汉字,那么可以按照姓名的首字母倒序排序吗?

    往期精彩

    畅想小组KTV点歌系统简介

    2020-10-19

    SQ小组KTV点歌系统简介

    2020-10-18

    凌云KTV点歌系统功能简介

    2020-10-17

    注意!在subList生成子列表之后,一定不要随便更改原列表

    2020-10-15

    神奇!一行代码实现删除某集合下标20-30的元素

    2020-10-14

    ‘小会计’的转行之旅

    2020-10-13

    子列表只是原列表的一个视图

    2020-10-12

    点分享

    点点赞

    点在看

  • 相关阅读:
    route命令基本使用
    Linux提权(capabilities)
    shell编程(case)
    VMware镜像迁移至zstack
    VMware安装zstack踩坑日记
    wordpress添加https
    python下载油管视频
    pandas多班级合并提取教师个人课表,多表同位置填充数据
    博客园美化备份
    Linux 运行Python文件/命令/程序,不因终端关闭而终止运行
  • 原文地址:https://www.cnblogs.com/a1111/p/14877381.html
Copyright © 2020-2023  润新知