我需要以自定义方式对对象数组进行排序.
假设我的对象中有两个字段 – 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++);
}
}