compareTo、Comparator、TreeSet排序那些事

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

一:对集合排序

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

/**
 * @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;
    }

二:测试

杂乱的数据,就被排好顺序输出来了
在这里插入图片描述
在这里插入图片描述

测试代码链接

本文测试代码

猜你喜欢

转载自blog.csdn.net/qq_42875345/article/details/112744158