昨天工作的時候寫了圖片的排序介面,讓後臺自定義圖片的位置. 話不多說先上修改圖片序號的實現原理: 將5號移到2號, 此時區間 [ 2,5 ) 內的排序號都要加1. 將2號移到5號, 此時區間 ( 2,5 ] 內的排序號都要減1. 新增圖片序號的實現原理: 新增圖片序號為3,那麼區間 [ 3,∞ ) ...
昨天工作的時候寫了圖片的排序介面,讓後臺自定義圖片的位置.
話不多說先上修改圖片序號的實現原理:
將5號移到2號, 此時區間 [ 2,5 ) 內的排序號都要加1.
將2號移到5號, 此時區間 ( 2,5 ] 內的排序號都要減1.
新增圖片序號的實現原理:
新增圖片序號為3,那麼區間 [ 3,∞ ) 內的序號均加1
瞭解原理後上實現代碼:
id:圖片ID;
imgType:圖片類型;
orderId:圖片序號.
private void orderIdSort(AppImgBackVo appImg){
Example exampleTwo = new Example(AppImg.class);
Example.Criteria criteriaTwo = exampleTwo.createCriteria();
criteriaTwo.andEqualTo("imgType", appImg.getImgType());
//通過圖片類型查找是否存在這個類型的圖片
List<AppImg> appImgList = appImgMapper.selectByExample(exampleTwo);
//如果沒有這個類型的圖片
if(appImgList.size() == 0){
//排序號賦值為1
appImg.setOrderId(1);
}else {
//如果不輸入排序號
if(appImg.getOrderId() == null){
//已存在的數量
Integer orderIdMax = appImgMapper.selectMaxOrderId(appImg.getImgType());
//如果是新增,排序號預設為:數量+1
if(appImg.getId() == null){
appImg.setOrderId(orderIdMax+1);
}else {//如果是修改:排序號預設為最大排序號
appImg.setOrderId(orderIdMax);
}
}else {//自定義排序號
//當排序號小於1時,預設為1
if(appImg.getOrderId() < 1){
appImg.setOrderId(1);
}
if(appImg.getId() == null){//添加
//排序號大於原有數量+1時預設為最大數+1
if(appImg.getOrderId() > appImgList.size()+1){
appImg.setOrderId(appImgList.size()+1);
}
//排序號大於原有數量+1時預設為原有數量+1
for (AppImg appImgTwo : appImgList){ 區間內排序號+1 if(appImgTwo.getOrderId() >= appImg.getOrderId()){
appImgTwo.setOrderId(appImgTwo.getOrderId()+1);
appImgMapper.updateByPrimaryKey(appImgTwo);
}
}
}else {//修改
if(appImg.getOrderId() > appImgList.size()){
//排序號大於原有數量+1時預設為原有數量
appImg.setOrderId(appImgList.size());
}
AppImg appImgOld = appImgMapper.selectByPrimaryKey(appImg.getId());
//原先的排序號
Integer orderIdOld = appImgOld.getOrderId();
//修改後的排序號
Integer orderIdNew = appImg.getOrderId();
//遍歷所有同類型圖片
for (AppImg appImgTwo : appImgList){
if(orderIdOld > orderIdNew){ //向前移動
//改動區間內的排序號+1
if(appImgTwo.getOrderId() >= orderIdNew && appImgTwo.getOrderId() < orderIdOld){
appImgTwo.setOrderId(appImgTwo.getOrderId()+1);
appImgMapper.updateByPrimaryKey(appImgTwo);
}
}else {//向後移動
//改動區間內的排序號-1
if(appImgTwo.getOrderId() <= orderIdNew && appImgTwo.getOrderId() > orderIdOld){
appImgTwo.setOrderId(appImgTwo.getOrderId()-1);
appImgMapper.updateByPrimaryKey(appImgTwo);
}
}
}
}
}
}
}
因為項目里在APP端需要展示的每個類型的圖片量比較少,所以我寫了個簡單的排序.
如果排序量成千上萬,數量比較多的不建議使用我這個實現原理,因為區間內每個圖片的序號都需要修改對數據的壓力比較大.
第一次寫博客,手有點抖,大佬們隨便看看就好