前言:对于后端开发而言,学会对数据的自定义排序还是十分有必要的。需要用到排序的场景也是很多的,什么排行版展示、利用时间+别的条件排序、还有预接单的数据就是要展示在已接单的数据前面这种需求、等等。总之很重要的!
一:对集合排序
对以下的数据做展示顺序排序:未接单>预接单>已接单。(注意里面有俩条一样的数据数据哦)
/**
* @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;
}
二:测试
杂乱的数据,就被排好顺序输出来了
测试代码链接