java – 按可空字段排序,说明项目的位置

我需要以自定义方式对对象数组进行排序.
假设我的对象中有两个字段 – priority(可空)和createdAt(不可为空).
优先级字段表示该项目应在哪个位置.但是,它可以为null.在这种情况下,我们应该考虑createdAt字段(降序).

让我用例子解释一下.
例如我的对象是:

Object0: priority: null, createdAt: 2018-12-01
Object1: priority: 1,    createdAt: 2018-12-02
Object2: priority: 5,    createdAt: 2018-12-03
Object3: priority: null, createdAt: 2018-12-04
Object4: priority: null, createdAt: 2018-12-05
Object5: priority: 2,    createdAt: 2018-12-06
Object6: priority: null, createdAt: 2018-12-07

最后的订单应该是:

> Object1(按优先级排序)
> Object5(优先级)
> Object6(由createdAt desc填充左侧位置)
> Object4(由createdAt desc填充左侧位置)
> Object2(优先级)
> Object3(由createdAt desc填充左侧位置)
> Object0(由createdAt desc填充左侧位置)

我怎么能实现我的目标?有没有开箱即用的比较器准备好了吗?

编辑:
我想我们可以使用那个类:

public class MyObject {
   Integer priority;
   LocalDateTime createdAt;
}

解决方法:

给定所有对象的列表:从优先级设置位置的数组是好的:

List<MyObject> list = new ArrayList<>(Arrays.asList(...));
MyObject[] res = new MyObject[list.size()];

>迭代您必须放置具有优先级的对象的对象

for (Iterator<MyObject> ite = list.iterator(); ite.hasNext(); ) {
    MyObject obj = ite.next();
    if (obj.getPriority() != null) {
        res[obj.getPriority() - 1] = obj;
        ite.remove();
    }
}

>通过降序createdAt对另一个进行排序

list.sort(Comparator.comparing(MyObject::getCreatedAt).reversed());

>将它们插入阵列的空盒子中

int indicList = 0;
for (int i = 0; i < res.length; i++) {
    if (res[i] == null) {
        res[i] = list.get(indicList++);
    }
}

> Complete Example over here

上一篇:Java专题:Collections.sort()


下一篇:剑指offer 45 把数组排成最小的数-toString()方法-StringBuilder动态增加字符数组-重写Comparator方法