现在有个列表 List ,元素 GoodsInfoDTO 里有 3 个字段 amount, isTop 和 topOrder。isTop 有的是 true, 有的是false,现在需要把字段 isTop 是 true 的元素放在 isTop 是 false 的前面,同时要保证 字段 isTop 是 true 的元素 是按照 amount 降序排序的, 最后把isTop是true的元素按照amount降序从1开始写入 topOrder,例如排在最前面的 isTop 是true的元素的topOrder是1。
/**
* 重新对商品排序,topN商品按照消耗量从上到下升序排序并写入topOrder,后面是普通商品
*/
public static List<GoodsInfoDTO> reorderGoodsInfoDTO(List<GoodsInfoDTO> goodsInfoDTOs) {
goodsInfoDTOs.sort(
// 先按 isTop 降序排序,将 true 放在前面
Comparator.comparing(GoodsInfoDTO::getIsTop).reversed()
// 再按 atmosphereConsumeAmount 降序排序
.thenComparing(Comparator.comparing(GoodsInfoDTO::getAtmosphereConsumeAmount).reversed())
);
// 对排序后的列表重新赋值 topOrder
int topOrderIndex = 1;
for (GoodsInfoDTO goods : goodsInfoDTOs) {
if (goods.getIsTop()) {
goods.setTopOrder(topOrderIndex++);
}
}
return goodsInfoDTOs;
}