一個排名調整問題惡心了我整整一天
問題回顧

在招投標行業(yè),某個項目的某個標段會有多家投標人來投標.為了選出中標企業(yè),會組織專家對投標人進行評審,在最后階段,如果有特殊原因允許對投標人排名進行臨時調整
如上圖所示,我們可以點擊排名按鈕,在彈框中選擇期望的排名,對投標人排名進行調整;
問題分析
🙌場景一
假如我們將第一名調整為第二名,那么第二名和第一名要對調位置,第三名保持不變,最終變?yōu)橛覀软樞?/p>
🙌場景二
假如我們把第三名調整為第一名,那么原來的第一名和第二名的排名要遞減1,最終變?yōu)橛覀软樞?/p>
🤦♀️以我淺薄的知識,感覺這個問題很棘手
剛開始我想我需要先把原來的排名查詢出來,然后分上面兩種情況去判斷,進而獲取各個元素的新排名,在建立舊排名和新排名的關聯(lián),然后通過這個關聯(lián)關系達到更新數(shù)據(jù)庫的目的
雖然這樣也可以做,但我最近放棄了這種方式,采用引入鏈表來實現(xiàn),下面來一起看看
解決方案
- HashMap<String, Object> params = new HashMap<>();
- params.put("projectId", bidder.getProjectId());
- params.put("sectionId", bidder.getSectionId());
- LinkedList<Integer> temp = new LinkedList<>();
- //查詢當前所有投標人排名
- LinkedList<Bidder> ranks = this.selectBidderRanking(bidder);
- //將所有企業(yè)舊排名先放入鏈表中
- ranks.forEach(i -> {
- temp.add(i.getBidderId());
- });
- //移除當前元素[就是跳轉排名的那個企業(yè)]
- temp.remove(bidder.getBidderId());
- //指定位置插入元素[以新排名為位置,重新插入那個企業(yè)]
- temp.add(Integer.parseInt(bidder.getRank()) - 1, bidder.getBidderId());
- //更新排名
- for (int i = 0; i < temp.size(); i++) {
- bidder.setBidderId(temp.get(i));
- bidder.setRank(String.valueOf(i + 1));
- bidderMapper.updateBidderRank(bidder);
- }
在我們剛剛分析的過程中,其實最麻煩的地方就是一個企業(yè)排名變化以后,其他的都要跟著變化,通過利用鏈表,我們只需要關注他的新排名,對應其他元素的升降已經由鏈表幫我們處理好,我們只需要重新遍歷,就可以獲取到新的排名。