首页 > 其他分享 >compareTo、Comparator、TreeSet排序那些事

compareTo、Comparator、TreeSet排序那些事

时间:2024-01-20 22:07:51浏览次数:26  
标签:return Comparator getName equals User compareTo 接单 new TreeSet


前言:对于后端开发而言,学会对数据的自定义排序还是十分有必要的。需要用到排序的场景也是很多的,什么排行版展示、利用时间+别的条件排序、还有预接单的数据就是要展示在已接单的数据前面这种需求、等等。总之很重要的!

compareTo、Comparator、TreeSet排序那些事_spring

一:对集合排序

对以下的数据做展示顺序排序:未接单>预接单>已接单。(注意里面有俩条一样的数据数据哦)

/**
 * @author 张子行
 * @class
 */
      	users.add(new User(1, "未接单"));
        users.add(new User(2, "已接单"));
        users.add(new User(3, "预接单"));
        users.add(new User(4, "已接单"));
        users.add(new User(5, "未接单"));
        users.add(new User(6, "已接单"));
        users.add(new User(7, "未接单"));
        users.add(new User(8, "预接单"));
        users.add(new User(9, "未接单"));
        users.add(new User(10, "已接单"));
        users.add(new User(11, "未接单"));
        users.add(new User(12, "已接单"));
        users.add(new User(13, "预接单"));
        users.add(new User(14, "未接单"));
        users.add(new User(15, "预接单"));
        users.add(new User(14, "未接单"));

方法一:Collections.sort+Comparator

Comparator接口返回值(正数:正在排序的数排后面 、0:原样输出 、 负数:正在排序的数排前面)

对User类型的数据排序:
先对未接单,与其他的状态做一个排序
如果o1是未接单,o2是别的状态,return -1,o1排前面。
如果o1是别的状态,o2是未接单,return 1,o1排后面。
接着对预接单,与其他的状态进行排序
如果o1是预接单,o2是别的状态,return -1,o1排前面。
如果o1是别的状态,o2是预接单,return 1,o1排后面。
其他的情况原样输出

/**
 * @author 张子行
 * @class
 */
Collections.sort(users, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                if ("未接单".equals(o2.getName())&&("预接单".equals(o1.getName()) || "已接单".equals(o1.getName()))) {
                    return 1;
                }
                if ("未接单".equals(o1.getName())&&("预接单".equals(o2.getName()) || "已接单".equals(o2.getName()))) {
                    return -1;
                }
                if ("预接单".equals(o1.getName())) {
                    return -1;
                }
                if ("预接单".equals(o2.getName())) {
                    return 1;
                }
                return 0;
            }
        });

这样就完成了排序需求咯,但是不能对相同的数据进行去重,仅仅是排序而已。

方法二:TreeSet+compareTo

TreeSet可以去重的同时在添加的时候就进行好了排序。TreeSet添加对象时此对象必须要实现Comparable<?>接口,进而实现compareTo方法,然后就可以自定义排序规则咯。

@Override
public int compareTo(User o):
参数o: 正在添加的元素
return 0 TreeSet会认为此时添加的对象是同一个对象,然后就添加不进去。
return 一个正数,都能添加到集合当中,参数o排前面
return 一个负数,都能添加到集合当中,参数o排后面

测试数据不变,改造User类即可。省略set、get方法,当正在添加的元素的id,TreeSet中已经有了的时候,那么return 0,就达到去重的目的了。另外最好重写一下equals和hashCode方法。

/**
 * @author 张子行
 * @class
 */
    private int id;
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return getId() == user.getId() &&
                Objects.equals(getName(), user.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getId(), getName());
    }

    /**
     * @param
     * @method 正在添加的元素(o)与TreeSet中已经存在的元素(this)进行比较
     * 按照
     */
    @Override
    public int compareTo(User o) {
        if ("未接单".equals(o.getName()) && ("预接单".equals(this.getName()) || "已接单".equals(this.getName()))) {
            return 1;
        }
        if ("未接单".equals(this.getName()) && ("预接单".equals(o.getName()) || "已接单".equals(o.getName()))) {
            return -1;
        }
        if ("预接单".equals(o.getName()) && "已接单".equals(this.getName())) {
            return 1;
        }
        if ("预接单".equals(this.getName()) && "已接单".equals(o.getName())) {
            return -1;
        }
        return this.getId() - o.getId();

    }

    public User() {
    }

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

二:测试

杂乱的数据,就被排好顺序输出来了

compareTo、Comparator、TreeSet排序那些事_spring_02


compareTo、Comparator、TreeSet排序那些事_后端_03

测试代码链接

本文测试代码


标签:return,Comparator,getName,equals,User,compareTo,接单,new,TreeSet
From: https://blog.51cto.com/u_16414043/9346273

相关文章

  • FindBugs问题EQ_COMPARETO_USE_OBJECT_EQUALS的解决方法
    本文记录的是2016年4月初发生的事情。前几天,标准CI的静态检查页面发现一个项目组同事引入的FindBugs问题,EQ_COMPARETO_USE_OBJECT_EQUALS,CI对这个问题给出的介绍如下ClassdefinescompareTo(...)andusesObject.equals()同事没见过这个问题,不了解如何修改,于是在中午回基......
  • 无涯教程-Java - Comparator 比较器函数
    TreeSet和TreeMap都按排序顺序存储元素。但是,比较器(Comparator)精确地定义了排序顺序的含义。比较器(Comparator)接口定义了两个方法:compare()和equals()。Compare方法intcompare(Objectobj1,Objectobj2)obj1和obj2是要比较的对象。如果对象相等,则此方法返回零。如果obj......
  • 无涯教程-Java - int compareToIgnoreCase(String str)函数
    此方法按字典顺序比较两个字符串,忽略大小写。intcompareToIgnoreCase-语法intcompareToIgnoreCase(Stringstr)这是参数的详细信息-str  - 要比较的字符串。intcompareToIgnoreCase-返回值此方法返回负整数(小于),零(等于)或正整数(大于)。intcompareToIgnore......
  • 无涯教程-Java - int compareTo(String anotherString)函数
    此方法按字典顺序比较两个字符串。intcompareTo-语法intcompareTo(StringanotherString)这是参数的详细信息-anotherString  - 要比较的字符串。intcompareTo-返回值如果两个字符串相等则值为0,如果大于则>0,小于则<0。intcompareTo-示例publicclassTes......
  • 无涯教程-Java - int compareTo(Object o)函数
    此方法将此字符串与另一个对象进行比较。intcompareTo-语法intcompareTo(Objecto)这是参数的详细信息-o  - 要比较的对象。intcompareTo-返回值两个对象比较,如果相等,则返回0,如果大于后面对象,则返回>0,否则返回<0intcompareTo-示例publicclassTest{p......
  • 无涯教程-Java - compareTo()函数
    该方法将调用该方法的Number对象与参数进行比较。可以比较Byte,Long,Integer等。但是,无法比较两种不同的类型,参数和调用该方法的Number对象应为同一类型。compareTo()-语法publicintcompareTo(NumberSubClassreferenceName)这是参数的详细信息-referenceName  - ......
  • 【JavaSE】集合Collection{List(ArrayList, LinkedList), Set(TreeSet, HashSet, Link
    集合单列集合:Collection接口单列集合:一次添加一个元素;如果集合中添加的是类,要重写equals方法,否则比较的是地址,无法正常删除内容相同的元素。单列集合通用遍历方式1.迭代器遍历2.增强for循环遍历增强for循环底层逻辑还是迭代器,字节码文件反编译为java会发现还是迭代......
  • 时间格式化转换及时间比较compareTo
    时间格式化转换及时间比较compareTo/***时间格式的转换:在具体报错的地方做转换,可能不能从根本上面解决问题。不排除在其他的代码位置也会使用该错误格式的数据。**1.可以将数据源的数据批量格式化yyyy-MM-dd(错误格式:yyyy-MM-dd00:00:00)......
  • after before compareTo
    入场日期要求晚于该人员在系统中登记的最后一次离场日期Java根据以上代码需求例子importjava.sql.*;importjava.util.Date;publicclassMain{publicstaticvoidmain(String[]args){//根据实际情况,替换以下连接信息Stringurl="jdbc:mysql:......
  • TreeSet
    TreeSet中的元素不可重复,可自动排序。TreeSet<Integer>treeset=newTreeSet<>();//构建TreeSet 排序功能演示publicclassMain{publicstaticvoidmain(Stringargs[]){TreeSet<Integer>treeset=newTreeSet<>();treeset.add(12);......